sed 用当前目录替换路径的一部分
Sed replace a part of a path with the current directory
我有一个包含很多路径的文件。我需要用当前路径替换所有这些路径(包含内部版本号)。
换句话说,在我的文件中我喜欢:
/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]+/
是一个 POSIX ERE 正则表达式(通过 -E
启用)匹配 /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
我有一个包含很多路径的文件。我需要用当前路径替换所有这些路径(包含内部版本号)。 换句话说,在我的文件中我喜欢:
/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]+/
是一个 POSIX ERE 正则表达式(通过-E
启用)匹配/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