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