我想将示例路径标记中的当前元素替换为:
...
<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
用某些东西替换