【问题标题】:Use Sed (or Perl or Ruby) to replace patterns that span across lines使用 Sed(或 Perl 或 Ruby)替换跨行的模式
【发布时间】:2014-01-24 11:53:31
【问题描述】:

通常使用 Sed(或 Perl 或 Ruby)替换文件中的内容:

sed -i.bak 's/\s+\\{/ {/g' some.code

在此示例中,我想删除代码中花括号之前的换行符,因为它们不是我的编程“方言”(对于我使用的任何语言)的一部分,并且会使代码阅读变得不那么自然和流畅。但基本问题是如何匹配跨行的模式,而不是文件任何给定行内的模式。

现有的看似相似的 SO 问题并没有具体解决如何跨越一般的行,而是针对用户试图解决的特定问题提供解决方案,有时通过变通方法代替。

我在 Sed 手册页中四处寻找,找不到任何开关来执行我所描述的操作。不过,也许我只是没有使用正确的关键字。

【问题讨论】:

  • 不幸的是 sed AFAIK 不能很好地处理换行符:stackoverflow.com/questions/1251999/… 其他一些工具可能会更好 :)
  • 使用 Perl 和 m regex modifier 很容易。
  • @nwellnhof:如果你用 Perl 给出答案,我会接受它......我知道我以前见过那个开关,我只是没有意识到它在 Perl 中但在 Sed 中缺失.
  • sed可以直接多行工作,先看这个网址:thegeekstuff.com/2009/12/…,如果你能提供示例输入文件,我们可以直接提供解决方案。

标签: regex sed


【解决方案1】:

使用 sed:

sed -r ':a;N;$!ba;s/\s+\{/ {/g' some.code

【讨论】:

    【解决方案2】:
    sed -r -unbuffered '$ !{N;s/\n[[:blank:]]*{/ {/;P;D;};$ p' some.code
    

    允许处理大文件(流版本)。在中小型(至少几千行)我想@BMW 的代码效率更高(1 个替换请求,在此代码中,每个加载行的替换)

    【讨论】:

      猜你喜欢
      • 2017-06-16
      • 2012-11-30
      • 2011-03-22
      • 2015-11-18
      • 2019-07-03
      • 2017-12-17
      • 1970-01-01
      • 2021-10-25
      • 2011-02-19
      相关资源
      最近更新 更多