【问题标题】:How to use sed to replace regex capture group?如何使用 sed 替换正则表达式捕获组?
【发布时间】:2015-08-06 12:31:48
【问题描述】:

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

lolsed_bulsh.png

我想在这些文件名前加上一个扩展路径,例如:

/full/path/lolsed_bullsh.png

我很难匹配和捕捉这些。目前我正在尝试以下变化:

cat myfile.txt| sed s/\(.+\)\.png/\/full\/path\/\1/g | ack /full/path

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

【问题讨论】:

  • BRE 不支持一个或多个+。请改用..*(如果您需要确保至少有 1 个字符)。

标签: regex bash sed


【解决方案1】:

在您的正则表达式中将+ 更改为*

sed -E "s/(.*)\.png/\/full\/path\/\1/g" <<< "lolsed_bulsh.png"

打印出来:

/full/path/lolsed_bulsh

注意:非标准-E 选项是为了避免转义()

【讨论】:

  • 我错过的细节是第一个捕获组位于\1,而不是\0,这似乎是整个当前行。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    sed 使用 POSIX BRE 和 BRE doesn't support one or more quantifier +。量词+ 只是supported in POSIX ERE。但是,POSIX sed uses BRE and has no option to switch to ERE

    如果要保持可移植性,请使用..* 模拟.+

    或者,如果您可以假设代码始终在 GNU sed 上运行,您可以使用 GNU 扩展 \+。或者,您也可以使用 GNU 扩展 -r 标志来切换到 POSIX ERE。 higuaro's answer 中的 -E 标志为 tagged for inclusion in POSIX.1 Issue 8,并存在于 POSIX.1-202x Draft 1 (June 2020) 中。

    【讨论】:

    • 在 GNU sed 中,-r 调用了ERE 功能,但请参阅here 了解更多详细信息。
    猜你喜欢
    • 2019-10-16
    • 1970-01-01
    • 2020-09-14
    • 2021-11-14
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多