繁体   English   中英

在XML文件中使用bash查找和替换字符串的一部分

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM