2011-05-27 35 views
3

使用GNU sed,我需要删除包括括号在内的括号内的词组,如(click here ....)click here后面的文字有所不同,但我需要删除整个外部圆括号。sed或perl仅当第一个内部词匹配时才删除外部括号

我试过放在下面许多变化,但我似乎无法击中右一个:

sed -e 's/\((click here.*[^)]*\)//' 

编辑愚蠢,我没有注意到,其实有经常断行的括号中间的字符串,所以sed可能不会起作用。例如:

(click here to 
enter some text) 

回答

2

用Perl你可以运行:

perl -00 -pe "s/\(click here [^)]*\)//g" inputfile > outputfile 

它将读取inputfile中一个字符串,然后替换所有出现的(click here anychar but '('),然后在输出文件中全部输出。

+0

“-00”的作用是什么?这工作! – 2011-05-27 17:57:13

+0

@Michael:它将记录分隔符定义为空,所以整个文件被读入一个字符串中。 – Toto 2011-05-27 18:01:04

3

如果没有嵌套的括号,也许你可以尝试这样的:

sed -e 's/(click here [^)]*)//' 
+0

这有立即删除了'点击here'和任何一个字下面,留下剩余的词和括号的结果。例如'(点击这里输入文字)'变成'(输入文字)' – 2011-05-27 16:57:21

+0

@Michael,可能不是。至少它在这里工作。无论如何,我只是发现,你不需要逃离parens。我相应地编辑了答案。 – sidyll 2011-05-27 17:02:41

+0

@Michael:你能提供一个它不起作用的测试用例吗?考虑:'回声“这是一个测试(点击这里输入文本)系统”|“ sed -e's /(点击这里[^]] *)//''请注意,如果在一行中可能出现多次点击,最后一次可能会出现g。 – 2011-05-27 17:10:08

1

这里的另一个sed做法,保持了完整的输入在保持缓冲区:

# see http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/ 
echo ' 
() 
(do not delete this) 
() 
(click here to 
enter some text) 
() 
' | 
sed -n '1h;1!H;${;g;s/(\([^)]*\))/\1/g;p;}'