在BASH中,删除两组字符之间的所有内容

时间:2011-04-18 13:52:59

标签: regex bash shell vim

我将一堆电子邮件文件合并到一个大文本文件中。现在我正在尝试从这些新文本文件中删除电子邮件中的所有标题行。我有一组独特的字符,我可以用它们作为标记在它们之间删除,但是我找不到会删除头文件的RegEx。下面是一个示例集(包括两个星号和底部的双等号)。


**


 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==

5 个答案:

答案 0 :(得分:2)

我不知道bash替换语法,但你想要的正则表达式是:

/\*\*.*?==/

在PHP中,代码为:

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

希望你可以毫不费力地将其翻译成bash。

<强>解释

这里的诀窍是.*??使.*懒惰,因此它会从**开始并匹配所有内容,直到找到第一个 ==为止。如果没有?,则.*会贪婪并抓取文档中第一个**和最后一个==之间的所有内容。所以,如果你有这样的事情:

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

...使用/\*\*.*?==/作为你的正则表达式会给你bar quux xyz,而/\*\*.*==/只会给xyz

答案 1 :(得分:2)

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

更改您的文件(-i),

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

将修改保存到新创建的文件中。

答案 2 :(得分: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

想法是在找到**时设置标记,然后跳过该行直到找到==

答案 3 :(得分:0)

在vim中,您可以为此映射一个键:

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

其中^ M实际上是control-V-M

按!!将删除**==

之间的所有内容

您可以将此地图放在.vimrc文件中,以使其成为全局。

答案 4 :(得分:0)

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

也是如此