[英]Find and replace part of a string using bash in an XML file
我是bash脚本的新手,一直在研究什么样的命令将帮助我替换xml文件中的特定字符串。
字符串看起来像
uri='file:/var/lib/abc/cde.repo/r/c/e/v/1.1/abc-1.1.jar'
应该换成
uri='file:/lib/abc-1.1.jar'
罐子也随弦而变化。 字符串“ file:/var/lib/abc/cde.repo/r/”的第一部分是恒定的,并且贯穿所有字符串。 第二半是变化的
这需要在整个文件中完成。 请注意,替换每个字符串比较容易,然后对每个字符串进行替换。 我正在尝试寻找解决方案,只需一个命令即可。
我知道我们可以使用sed,但是如何使用? 任何指针都受到高度赞赏
谢谢
与sed
:
sed "s~uri='file:/var/lib/abc/cde.repo/r/c/e/v/1\.1/abc-1.1.jar~uri='file:/lib/abc-1\.1\.jar'~g"
基本上是:
sed "s~pattern~replacement~g"
其中s
是命令替换,尾随g
表示全局。 我将~
用作定界符char,因为这有助于避免转义所有/
路径。 (感谢@Jotne)
更新:为了使正则表达式更加灵活,您可以尝试以下操作:
sed 's~file.*/\(.*\.jar\)\(.*\)~file:///lib/\1\2~' a.txt
它搜索file: ... .jar
链接,获取jar文件的名称并建立新链接。
使用awk
您可以执行以下操作:
awk -F/ '/file:\/var\/lib\/abc\/cde.repo\/r/ {print $1,$3,$NF}' OFS=/ file
uri='file:/lib/abc-1.1.jar'
静态网址,但文件名正在更改。
您无需使用sed
甚至awk
。 您可以简单地使用basename
:
prefix='file:/lib/'
uri='file:/var/lib/abc/cde.repo/r/c/e/v/1.1/abc-1.1.jar'
result="${prefix}$(basename ${uri})"
echo ${result}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.