在 bash 中用多个 xml 文件的 SED 替换 PATH 元素

在 bash 中用多个 xml 文件的 SED 替换 PATH 元素

我已经成功替换了 1 个 xml 文件。然而,我从test1.xml到都有 10 个test30.xml,它们最后有不同的路径:

  • test1.xml
    ...
    <examples>
    <example path='/test/test123/st1.txt'/>
    <examples>
    ...
    
  • test2.xml
    ...
    <examples>
    <example path='/test/test123/te2.txt'/>
    <examples>
    ...
    

等等,直到

  • test30.xml
    ...
    <examples>
    <example path='/test/test123/removethispart.txt'/>
    <examples>
    ...
    

输出应该看起来像这样:

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

以前我用过这个,它可以改变一个文件

sed -i "s#<example path='/test/test123/st1.txt'/>#<example path=/test/test123/>#" test1.xml

但是,我想一次更改多个文件并执行以下脚本,但在catxml 文件上,它没有显示更改

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

任何帮助将不胜感激。谢谢你的时间!

答案1

问题的原因是您在需要正则表达式模式的地方使用了“shell glob”(又名“通配符”)模式。

该部分/test/test123/*.txt实际上表示 " /test/test123,后跟零个或多个/字符,后跟任何单个字符,最后跟txt"。

这种模式不是您想要的,并且在您的文件中也不存在。

相反,您需要的是/test/test123/[^.]*\.txt,意思是 " /test/test123/,后跟任意数量的字符不是.请参阅“贪婪正则表达式”了解为什么这是必要的),然后是字面意思., 其次是txt”。

完整的命令将如下所示

sed -i "s#<example path='/test/test123/[^.]*\.txt'/>#<example path='/test/test123/'>#" *.xml

笔记

.如果您的文件名除了扩展名之外还可以包含.txt其他内容,则上述内容将无法正常工作。在这种情况下,使用

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

意思是 " /test/test123/,后跟零个或多个任何类型的字符,后跟文字.,后跟txt"。这将正常工作,除非该.txt模式稍后会再次出现在该行上(您的输入不应出现这种情况)。

答案2

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

这解决了我的问题。大家干杯! :)

相关内容