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

Regex 在XML文件中使用bash查找并替换字符串的一部分,regex,bash,sed,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/”的第一部分是常量,跨越所有字符串。下半场情况有所不同 这需要在整个文件中完成。请注意,替换一个字符串比为每个不同的字符串替换一

我不熟悉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
表示全局。我使用
~
作为分隔符字符,因为这有助于避免转义路径中的所有
/
。(谢谢@Jotne)


更新:为了使正则表达式更灵活,您可以尝试以下方法:

sed 's~file.*/\(.*\.jar\)\(.*\)~file:///lib/\1\2~' a.txt 
它搜索
文件:。jar
链接,获取jar文件的名称并构建新链接。

使用
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
表示全局。我使用
~
作为分隔符字符,因为这有助于避免转义路径中的所有
/
。(谢谢@Jotne)


更新:为了使正则表达式更灵活,您可以尝试以下方法:

sed 's~file.*/\(.*\.jar\)\(.*\)~file:///lib/\1\2~' a.txt 

它搜索
文件:。jar
links,获取jar文件的名称并构建新链接。

使用
awk
可以执行以下操作:

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

静态URL,但更改文件名。

使用
awk
可以执行以下操作:

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

静态URL,但更改文件名。

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

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

感谢hek2mgl的快速响应!那很快。如何在字符串的前半部分是静态的,而后半部分不断变化的情况下重复执行此操作(根据问题)。我想用类似的格式替换文件中的所有字符串。例如,第二个字符串看起来像uri='file:/var/lib/abc/cde.repo/t/e/s/t/v/1.9/zzz-1.9.jar'将替换为'uri='file:/lib/zzz-1.9.jar',请尝试以下
sed-re“s~uri='file:\s+/(\s+“$~uri file:/lib/\1'~g”文件
@hek2mgl,这里有近23000个点,您应该知道,
sed
可以使用如下不同的分隔符:
sed“s~uri='file:/var/lib/abc/cde.repo/r/c/e/v/1\.1/abc-1.1.jar='file:/lib/abc-1\.1\.jar~g'
这样您就不需要逃避我今天必须离开的所有
//code>@Masti。如果你明天有耐心,我可以帮你。。我想社区可能会更快……)@Jotne我认为文本编辑是sed的一项任务。虽然可以使用
awk
,但是这里应该使用
sed
。甚至
xslt
,因为正则表达式和
html/xml
不是朋友。。。。。特写,谢谢你的
~
…)感谢hek2mgl的快速响应!那很快。如何在字符串的前半部分是静态的,而后半部分不断变化的情况下重复执行此操作(根据问题)。我想用类似的格式替换文件中的所有字符串。例如,第二个字符串看起来像uri='file:/var/lib/abc/cde.repo/t/e/s/t/v/1.9/zzz-1.9.jar'将替换为'uri='file:/lib/zzz-1.9.jar',请尝试以下
sed-re“s~uri='file:\s+/(\s+“$~uri file:/lib/\1'~g”文件
@hek2mgl,这里有近23000个点,您应该知道,
sed
可以使用如下不同的分隔符:
sed“s~uri='file:/var/lib/abc/cde.repo/r/c/e/v/1\.1/abc-1.1.jar='file:/lib/abc-1\.1\.jar~g'
这样您就不需要逃避我今天必须离开的所有
//code>@Masti。如果你明天有耐心,我可以帮你。。我想社区可能会更快……)@Jotne我认为文本编辑是sed的一项任务。虽然可以使用
awk
,但是这里应该使用
sed
。甚至
xslt
,因为正则表达式和
html/xml
不是朋友。。。。。特写,谢谢你的
~
…)