regex - sed 用当前目录替换路径的一部分

标签 regex linux unix sed

我有一个包含很多路径的文件。我需要用当前路径替换所有这些路径(包含版本号)。 换句话说,在我的文件中,我有这样的内容:

/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/

相关文章:

linux - 删除每行末尾的 ';'

javascript - 验证需要匹配特定条件(正则表达式)的字符串?

regex - 将可选参数与 Bash 正则表达式中的非捕获组匹配

php - 以编程方式确定视频文件格式?

linux - centOS 6.6 和 centos 7 : auto restart a service if it stopped

linux - Linux 中的 grep 空白字段

regex - 逆正则表达式处理以生成正则表达式短语

javascript - 找到以某物开头的行,并在这一行中找到单词

linux - 在 'condition variable' wait_for() notify() 机制中使用 CLOCK_MONOTONIC 类型

c - brk() 系统调用有什么作用?