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

时间:2013-11-16 20:49:31

标签: regex bash sed

我是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但是怎么样?任何指针都非常受欢迎

由于

3 个答案:

答案 0 :(得分:3)

使用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文件的名称并构建新链接。

答案 1 :(得分:2)

使用awk即可:

awk -F/ '/file:\/var\/lib\/abc\/cde.repo\/r/ {print $1,$3,$NF}' OFS=/ file
uri='file:/lib/abc-1.1.jar'

静态网址,但更改文件名。

答案 2 :(得分:0)

您无需使用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}