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