sed用多次出现的单词替换单词分隔符

时间:2014-08-04 20:34:15

标签: replace sed

有点新的sed。我制作了一个脚本来替换文件中的各种文本。例如,文件test.txt包含:

My name is <Jack>.
My dad calls me <Jack>. My mum calls me <Jack>, too.

我想替换“&lt;”和“&gt;”用“:”。我用了这个命令

sed -re 's/<(.+?)>/:\1:/g' test.txt

返回

My name is :Jack:.
My dad calls me :Jack>. My mum calls me <Jack:, too.

因此,它适用于一行中的单个出现。行中多次出现的结果是错误的,因为sed参数是第一个“&lt;”之间的所有文本。和最后一个“&gt;”。

任何提示? (还有一点解释......)

谢谢!

编辑:

在Gedit或其他编辑器中使用replace时,相同的正则表达式可以正常工作。

2 个答案:

答案 0 :(得分:3)

最简单的:

kent$  echo "My name is <Jack>.
dquote> My dad calls me <Jack>. My mum calls me <Jack>, too."|sed 's/[<>]/:/g'
My name is :Jack:.
My dad calls me :Jack:. My mum calls me :Jack:, too.

如果你想使用群组:

kent$  echo "My name is <Jack>.
My dad calls me <Jack>. My mum calls me <Jack>, too."|sed -r 's/<([^>]*)>/:\1:/g'
My name is :Jack:.
My dad calls me :Jack:. My mum calls me :Jack:, too.

在你的代码中,你想要使用非贪婪匹配,不幸的是,sed并不支持。所以你得到你的输出的原因是:

整个

<Jack>. My mum calls me <Jack>

就像<....>

.+匹配Jack>. My mum calls me <Jack

答案 1 :(得分:0)

我更新了示例。

这是test.html:

My name is <a href="filename.html#firstAnchor">Jack</a>.
My dad calls me <a href="filename.html#firstAnchor">Jack</a>. My mum calls me <a href="filename.html#secondAnchor">Jack</a>, too.

这个命令给我预期的结果:

sed -re 's/<a href="filename.html#[^>]*>([^<]*)<\/a>/:\1:/g' test.html

结果:

My name is :Jack:.
My dad calls me :Jack:. My mum calls me :Jack:, too.

搜索以<a href="filename.html#开头且所有后续字符但不是“&gt;”的标记(选项[^>]),而不是搜索“&gt;”。参数是任何字符“&lt;” (选项[^<]),而分隔符是“&lt; / a&gt;”。

我明白了吗?