我将一堆电子邮件文件合并到一个大文本文件中。现在我正在尝试从这些新文本文件中删除电子邮件中的所有标题行。我有一组独特的字符,我可以用它们作为标记在它们之间删除,但是我找不到会删除头文件的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==
答案 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'
。