【问题标题】:Pipe sed capture group through external program before replacing?在替换之前通过外部程序管道 sed 捕获组?
【发布时间】:2020-02-22 21:21:05
【问题描述】:

有没有办法让sed 将捕获组通过管道传输到另一个程序,使正则表达式的 RHS 中的 \1 等于该程序的输出?

比如跑步

sed 's/lorem ipsum \(foobar\)/\1/g' file.txt

是否将“foobar”通过另一个程序(例如,tr 'o' 'a')使\1 成为“faabar”,而sed 将“lorem ipsum foobar”替换为“lorem ipsum faabar”?

这只是一个简单的例子。我意识到我可以在不使用tr 的情况下将“foobar”转换为“faabar”。

【问题讨论】:

  • 发布输入和预期输出样本。它可能会以您认为的其他方式解决。
  • @Jotne 我添加了一个更完整的工作示例。
  • GNU sed 有一个 /x 选项;但是你正在尝试的东西在很多层面上都是错误的。使用具有适当 HTML 解析器的工具。您的代码可以很容易地在 Perl 中重新实现,但是 PHP 也没有这样的功能(更不用说用于逐行读取文件并应用正则表达式的功能了。不是说我会推荐 PHP 做任何事情)?跨度>
  • 有一个著名的笑话是尝试用正则表达式解析 HTML,但是 we are not supposed to link to it.

标签: regex sed replace pipe capture-group


【解决方案1】:

使用执行选项:

e
此命令允许将来自 shell 命令的输入通过管道传输到模式空间。如果进行了替换,则执行在模式空间中找到的命令,并将模式空间替换为其输出。尾随换行被抑制;如果要执行的命令包含 NUL 字符,则结果未定义。这是一个 GNU sed 扩展。

(source;original source)

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2018-04-27
    • 2016-06-17
    • 2017-12-05
    相关资源
    最近更新 更多