0

在 Mac osx 10.6.8 上使用 Sed 创建一个带有文本编辑器的 .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 将第一个链接作为起始值,将最后一个 /link 作为终止值,导致两者之间的所有内容都被删除。我如何让 Sed 理解它应该在链接之后使用第一个 /link 而不是最后一个?

4

2 回答 2

1

因为.*很贪心。尝试:

sed 's@<link>[^<]*</link>@@g'
于 2012-08-05T10:50:54.043 回答
1

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

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

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

sed 's%<link>[^<>]*</link>%%g'
于 2012-08-05T10:52:34.290 回答