Perl 或 sed:正则表达式替换为组捕获



在这个例子中,我似乎无法sed做正则表达式替换为组捕获:

  • 输入:"完成项目 1">
  • 期望的放字:"项目 1 完成">

我尝试了什么sed

$ 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

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

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

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

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

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

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

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

最新更新