2011-04-18 87 views
1

我已經將一堆電子郵件文件合併爲一個大文本文件&現在我試圖從這些新的文本文件中刪除電子郵件中的所有標題行。我有一組獨特的字符,我可以用它們作爲標記在它們之間刪除,但是我找到了一個RegEx來刪除頭文件。下面是一個示例集(包括兩個星號和底部的double等號)。在BASH中,刪除兩組字符之間的所有內容

 

** 


w54cs6547wem;   Sat, 30 Oct 2010 00:06:43 -0700 (PDT) 
s10mr13764658ybi.218.1288422402631;   Sat, 30 Oct 2010 00:06:42 -0700 (PDT) 


p13si451872ybk.2.2010. .36;   Sat, 30 Oct 2010 00:06:42 -0700 (PDT) 

    Sat, 30 Oct 2010 02:01:23 -0500 

Date: Sat, 30 Oct 2010 02:01:22 -0500 Subject: 
Message-ID: 
Thread-Index: Act4ABHi0HfIPTIzRwe9oy8ojziTig== 
+0

我想我可以使用雙星號和雙等號作爲標記 – Schoffelman 2011-04-18 13:56:17

回答

2
sed -i '/\*\*/,/==/d' FILE 

改變的地方你的文件(-i),

sed '/\*\*/,/==/d' FILE > MODIFIED 

保存修改新創建的文件。

+0

謝謝@user unknown - 'sed'/ \ * \ * /,/ ==/d'FILE> MODIFIED'正是我需要和/或使用的 – Schoffelman 2011-04-19 10:59:46

2

我不知道bash的替代語法,但你想要的正則表達式是:

/\*\*.*?==/ 

在PHP中,代碼如下:

$str = preg_replace('/\*\*.*?==/', '', $str); 

希望你可以把這一進入bash沒有任何麻煩。

說明:

這裏的竅門是.*??使.*懶惰,所以它會從**開始,並匹配所有內容,直到它找到第一個==。如果沒有?.*會很貪婪,並抓住文檔中第一個**和最後的==之間的所有內容。所以,如果你有這樣的事情:

**foo==bar **baz==quux **abc==xyz 

...使用/\*\*.*?==/爲您的正則會給你bar quux xyz,而/\*\*.*==/只會xyz放棄。

+0

實際上,PHP的安裝在盒子上,所以我可以給這個鏡頭。 – Schoffelman 2011-04-18 14:04:13

1

如果你打算這樣做,很可能你會在內存中處理整個文件。這是一個逐行的方法。

$> cat file 
some words 
here that i want 
** 


w54cs6547wem;   Sat, 30 Oct 2010 00:06:43 -0700 (PDT) 
s10mr13764658ybi.218.1288422402631;   Sat, 30 Oct 2010 00:06:42 -0700 (PDT) 


p13si451872ybk.2.2010. .36;   Sat, 30 Oct 2010 00:06:42 -0700 (PDT) 

    Sat, 30 Oct 2010 02:01:23 -0500 

Date: Sat, 30 Oct 2010 02:01:22 -0500 Subject: 
Message-ID: 
Thread-Index: Act4ABHi0HfIPTIzRwe9oy8ojziTig== 

other words 
here that i also want 

$> awk '/^\*\*/{f=1;next} f&&/==$/{f=0;next} f{next} !f' file 
some words 
here that i want 

other words 
here that i also want 

的想法是設置一個標誌是當發現**,然後跳過線,直到==被發現。其中^ M是實際控制-V-M

map !! /\*\*^Mmk/==^Mjd`k 

!!:

0

在VIM可以映射鍵此將刪除**==之間的所有內容

您可以將該地圖放在.vimrc文件中,也可以將它放到全局位置。

0

在perl中很容易表達:cat file | perl -p -i -e 'undef $_ if /^\*\*/ .. /==$/'。相同的sed:cat file | sed -e '/^\*\*/,/==$/d'

+1

至少在sed-command中無用的貓。 – 2011-04-18 15:30:28

+0

@user unknown:如果您不想覆蓋文件(通常我想在執行破壞性操作之前檢查完成了什麼),這並非無用。對於perl,你可以替換'cat file | perl -p -i -e ...'與'perl -p -i -e ... file'並且立即應用變化,因爲sed是'sed -i -e ... file'。如果你的意思是更換'cat file | cmd'與'cmd ZyX 2011-04-18 16:01:11

+0

但是sed已經把'sed'/^\ * \ * /,/ == $/d'file'的參數作爲參數提供給你你需要的一切 - -i與調用cat和pipe是正交的。附加'|少「是一個獨立的選擇。 – 2011-04-18 17:40:06

相關問題