在这个例子中,我似乎无法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
和之后的所有内容。没有第二场比赛可以进行。