我有一个包含很多路径的文件。我需要用当前路径替换所有这些路径(包含版本号)。 换句话说,在我的文件中,我有这样的内容:
/build/8b7yrg_k/12/src/main/myfile
我想要(如果我在/build/home/0/):
/build/home/0/src/main/myfile
我正在尝试做的是:
sed 's,/build/'.+'/'[0-9]+'/','$PWD',g
但是该命令找不到该模式。我还尝试添加\或删除 ' 但我无法匹配所需的模式
最佳答案
有几个问题:
- 在 POSIX BRE 模式中,
+
被视为文字字符,而不是量词 - 在单引号中,不启用变量扩展
- 替换内容缺少斜杠(即使您修复了上述问题,当前目录也会粘在路径的其余部分上)。
你可以使用
sed -E 's,/build/[^/]+/[0-9]+/,'"$PWD"/',g'
sed 's,/build/[^/]*/[0-9]*/,'"$PWD"/',g'
详细信息:
-
/build/[^/]+/[0-9]+/
是一个与-E
匹配的 POSIX ERE 正则表达式(通过/build/
启用) 、/
之外的一个或多个字符,然后是/
,一位或多位数字,然后是/
chr -
/build/[^/]*/[0-9]*/
是一个 POSIX BRE 模式,其作用与上面相同 -
"$PWD"/
- 当前目录变量位于双引号内,并且/
添加是为了使此替换模式发挥作用。
请参阅online demo :
#!/bin/bash
s='/build/8b7yrg_k/12/src/main/myfile'
sed -E 's,/build/[^/]+/[0-9]+/,'"$PWD"/',g' <<< "$s"
sed 's,/build/[^/]*/[0-9]*/,'"$PWD"/',g' <<< "$s"
输出:
/home/3octv4/src/main/myfile
/home/3octv4/src/main/myfile
关于regex - sed 用当前目录替换路径的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70082471/