有点新的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时,相同的正则表达式可以正常工作。
答案 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;”。
我明白了吗?