用于重写某些字符串的Sed脚本

时间:2018-06-05 11:56:24

标签: regex sed

我正在处理一组包含非结构化文本的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

2 个答案:

答案 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参数。但请务必先检查结果。