我正在处理一组包含非结构化文本的XML文件,这些文本带有个人名称的语义标记。
由于最终会通过Web应用程序显示它们的样式表,我需要替换:
<persName>Fred</persName>'s
<persName>Wilma</persName>'s
与
<persName>Fred's</persName>
<persName>Wilma's</persName>
我在shell脚本中有一行,在下面的Gitbash for Windows中运行。它运行正常,但没有效果。我想我错过了一些明显的东西,也许与逃避角色有关,但任何帮助都会受到赞赏。
sed -i "s/<\/persName>\'s/\'s<\/persName>/g" test.xml
答案 0 :(得分:4)
您可以使用
sed -i "s,</persName>'s,'s</persName>,g" test.xml
<强>详情
s
- 我们要替换,
- 分隔符</persName>'s
- 要查找的字符串,
- 分隔符's</persName>
- 替换为此字符串,
- 分隔符g
- 如果找到多个,则多次 -i
选项直接在文件中进行替换。
请注意,在双引号字符串中定义sed命令时,不必转义'
。
如果在正则表达式或/和替换模式中有/
个字符,则最好使用除公共/
之外的分隔符字符。
答案 1 :(得分:1)
对您的问题的评论提出了一个更简单的解决方案,但我想,可能存在后缀's
不同的名称,例如以s
结尾的名称。因此,我选择了一个解决方案,您可以抓住正确的解决方案并将其放在中间位置。
作为sed中搜索和替换命令的分隔符,您可以选择所需的任何内容。我选择了#
,因此您无需逃避文本中的反斜杠。转义的parantheses存储变量\1
和\2
内的内容。
sed 's#<persName>\(.*\)</persName>\(.*\)#<persName>\1\2</persName>#g' testfile
结果:
<persName>Fred's</persName>
<persName>Wilma's</persName>
如果要在文件中替换它,可以使用-i
参数。但请务必先检查结果。