【问题标题】:Perl or sed: Regex replace with group capturePerl 或 sed:正则表达式替换为组捕获
【发布时间】:2020-09-14 18:01:30
【问题描述】:

在此示例中,我似乎无法让 sed 使用组捕获进行正则表达式替换:

  • 输入:“完成项目 1”
  • 所需的 putput:“project 1 DONE”

我对@9​​87654322@ 的尝试:

$ echo "DONE project 1" | sed -E 's/^DONE(.*)$/$1 DONE/g'
$1 DONE  # fail! no group capture in `sed`?

Perl 有没有办法做到这一点?

实际上这是 DEVONthink[^1] 使用的 AppleScript 的一部分,我意识到 sed 无法使用组捕获进行正则表达式搜索/替换。

[^1]:DEVONthink 使用 AppleScript 搜索/替换脚本

set transformedName to do shell script "echo " & quoted form of itemName & " | sed -E 's/" & sourcePattern & "/" & destPattern & "/g'"
set name of selectedItem to transformedName

【问题讨论】:

    标签: perl sed


    【解决方案1】:

    sed 可以轻松做到这一点,使用\1$1 是 Perl 反向引用语法:

    sed -E 's/^DONE(.*)/\1 DONE/g'
    

    .* 匹配所有行到最后,因此您不必在 LHS 中使用 $

    【讨论】:

    • 尽管它并不需要 $,但我还是想把它放在里面,以提醒自己六个月后我打算把剩下的行。
    【解决方案2】:

    Perl 版本非常接近 sed 版本,因为 Perl 窃取了 sed 的一些功能:

    $ perl -pe 's/^DONE(.*)/\1 DONE/'
    

    -p 有效地将 while(<>) { ...; print } 包裹在您对 -e 的参数周围。

    请注意,/g 标志在这里没有多大意义。您将匹配第一个 DONE 以及之后的所有内容。没有第二场比赛可做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2021-11-14
      • 2014-06-19
      • 2010-11-19
      • 1970-01-01
      • 2019-10-16
      相关资源
      最近更新 更多