如何使用sed替换正则表达式捕获组?

kev*_*ler 14 regex bash sed

我有一个大文件,有许多分散的文件路径,看起来像

lolsed_bulsh.png
Run Code Online (Sandbox Code Playgroud)

我想在扩展路径前添加这些文件名,如:

/full/path/lolsed_bullsh.png
Run Code Online (Sandbox Code Playgroud)

我很难匹配和捕捉这些.目前我正在尝试各种变化:

cat myfile.txt| sed s/\(.+\)\.png/\/full\/path\/\1/g | ack /full/path
Run Code Online (Sandbox Code Playgroud)

我认为sed有一些正则表达式或捕获组行为我不理解

hig*_*aro 23

在您正则表达式的变化+*:

sed -E "s/(.*)\.png/\/full\/path\/\1/g" <<< "lolsed_bulsh.png"
Run Code Online (Sandbox Code Playgroud)

它打印:

/full/path/lolsed_bulsh
Run Code Online (Sandbox Code Playgroud)

注:非标准 -E选择是避免逃逸()

  • 我错过的细节是第一个捕获组在`\ 1`,而不是`\ 0`,它似乎是整个当前行. (2认同)

Cez*_*usz 10

通过选择不同的分隔符(和-E选项)来避免一些转义,例如:

cat myfile.txt | sed -E "s|(..*)\.png|/full/path/\1|g" | ack /full/path
Run Code Online (Sandbox Code Playgroud)


nha*_*tdh 6

sed使用POSIX BRE,而BRE不支持一个或多个量词+.量词+在POSIX ERE中受支持.但是,POSIX sed使用BRE并且无法切换到ERE.

使用..*模拟.+,如果你想保持便携性.

或者,如果您可以假设代码始终在GNU sed上运行,则可以使用GNU扩展.\+.或者,您也可以使用GNU扩展-r标志切换到POSIX ERE.该-Ehiguaro的答案与BSD兼容的sed无证标志具有同等效力.