我已经成功替换了 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
但是,我想一次更改多个文件并执行以下脚本,但在cat
xml 文件上,它没有显示更改
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
这解决了我的问题。大家干杯! :)