有没有办法sed
将捕获组通过管道传输到另一个程序,使\1
正则表达式的 RHS 等于该程序的输出?
例如,运行
sed 's/lorem ipsum \(foobar\)/\1/g' file.txt
是否将“foobar”通过另一个程序(例如,tr 'o' 'a'
)\1
管道化为“faabar”,sed
以用“lorem ipsum faabar”替换“lorem ipsum foobar”?
这只是一个简单的例子。我意识到我可以在不使用tr
.
有没有办法sed
将捕获组通过管道传输到另一个程序,使\1
正则表达式的 RHS 等于该程序的输出?
例如,运行
sed 's/lorem ipsum \(foobar\)/\1/g' file.txt
是否将“foobar”通过另一个程序(例如,tr 'o' 'a'
)\1
管道化为“faabar”,sed
以用“lorem ipsum faabar”替换“lorem ipsum foobar”?
这只是一个简单的例子。我意识到我可以在不使用tr
.
您可以使用 GNU sed - 使用
e
(execute) 修饰符:(来源)
但它的用处有限,因为它执行并替换了整个模式空间,而不是指定的捕获组。所以你需要跳过一些非常丑陋的箍。
前任。
据我所知:没有。
可以使用将模式空间写入文件
但不是捕获组。您可以使用执行外部程序
你可以读取一个文件
但我没有看到一种可维护的方式来做你所要求的。坦率地说,你正处于有用的边缘
sed
。awk
这里可能会更灵活一些,但这perl
是你最好的选择,正如@ikkachu 在他的评论中已经建议的那样。作为一个简短的想法,它是多么微不足道
perl
:(对于那些更精通 Perl 的人:我知道它很丑陋,在生产中运行之前可能需要相当多的抛光)