SED通配符选择范围太大

时间:2012-08-05 10:46:30

标签: sed geektool

在Mac上使用Sed osx 10.6.8使用文本编辑器创建一个.command文件,该文件将在Geektool中执行。我有一个字符串MYSTRING并尝试从中删除链接标记。但是当使用通配符时,Sed似乎选择了太长的范围。

MYSTRING="<link>part_1</link>This part must remain.<link>part_x</link> Like this part."
echo $MYSTRING |
sed s/"<link>".*"<\/link>"//g

我原以为这个结果:

This part must remain. Like this part.

但实际结果是:

 Like this part.

似乎Sed将第一个链接作为from-value,将最后一个/ link作为to-value,从而导致其间的所有内容都被删除。如何让Sed理解它应该在链接之后取第一个/链接而不是最后一个?

2 个答案:

答案 0 :(得分:1)

因为.*贪婪。尝试:

sed 's@<link>[^<]*</link>@@g'

答案 1 :(得分:1)

正则表达式重复运算符*的行为是匹配最长的,最左边的匹配。不幸的是,sed不支持吝啬匹配,但Perl会这样做:

perl -pe 's%<link>.*?</link>%%g'

或者你可以制定一个正则表达式,贪婪的匹配是没有问题的;

sed 's%<link>[^<>]*</link>%%g'