如何在bash中搜索并用xml文件的SED替换PATH元素

如何在bash中搜索并用xml文件的SED替换PATH元素

我想将示例路径标记中的当前元素替换为:

...
<examples>
<example path='/test/test123/test12345.txt'/>
<examples>
...

...
<examples>
<example path=/test/test123/>
<examples>
...

sed -i 's/<example path=\/test\/test123\/test12345.txt'>/<example path=\/test\/test123\/>' 123.xml

但它说:

-bash: example: No such file or directory

答案1

由于单引号不匹配,您会收到错误。

带引号的字符串以第二个引号结束。 shell 发现未加引号>/<example并将其解释为重定向。

另外你的sed命令不完整。/缺少尾随分隔符。

我还修复了sed命令以匹配已编辑的输入数据。

如果您想在sed命令中使用单引号,则必须在命令周围使用双引号,并确保双引号内没有任何内容会被 shell 扩展

sed -i "s/<example path='\/test\/test123\/test12345.txt'\/>/<example path=\/test\/test123\/>/" 123.xml

或者像这样使用转义单引号

sed -i 's/<example path='\''\/test\/test123\/test12345.txt'\''\/>/<example path=\/test\/test123\/>/' 123.xml

顺便说一句:如果您使用不同的分隔符(不是斜杠/),则不需要转义模式或替换中的斜杠,例如

sed -i "s#<example path='/test/test123/test12345.txt'/>#<example path=/test/test123/>#" 123.xml
sed -i 's#<example path='\''/test/test123/test12345.txt'\''/>#<example path=/test/test123/>#' 123.xml

问题中所示的所需输出不是有效的 XML。属性必须加引号。

答案2

您应该使用 XML 编辑器来编辑 XML。它可以处理文件中 XML 模式布局的更改、意外注释等。我的首选是xmlstarlet

示例文件,x.xml

<root>
  <examples/>
  <example path='/test/test123/test12345.txt'/>
  <examples/>
</root>

path命令,将任何元素中的属性更新example为值/test/test123

xmlstarlet ed --update '//example/@path' --value '/test/test123' x.xml

输出

<?xml version="1.0"?>
<root>
  <examples/>
  <example path="/test/test123"/>
  <examples/>
</root>

答案3

sed -i -e s/test\///g 123.xml 只是删除, sed -i -e s/test\//replacement/g 123.xml 用某些东西替换

相关内容