在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理解它应该在链接之后取第一个/链接而不是最后一个?
答案 0 :(得分:1)
因为.*
贪婪。尝试:
sed 's@<link>[^<]*</link>@@g'
答案 1 :(得分:1)
正则表达式重复运算符*
的行为是匹配最长的,最左边的匹配。不幸的是,sed
不支持吝啬匹配,但Perl会这样做:
perl -pe 's%<link>.*?</link>%%g'
或者你可以制定一个正则表达式,贪婪的匹配是没有问题的;
sed 's%<link>[^<>]*</link>%%g'