【问题标题】:Change three or more empty lines into two using bash, sed or awk使用 bash、sed 或 awk 将三个或更多空行变为两个
【发布时间】:2018-04-24 06:09:55
【问题描述】:

假设我们有包含单词和多个空行的字符串。比如

"1\n2\n\n3\n\n\n4\n\n\n\n2\n\n3\n\n\n1\n"

我想使用 bash,sed 或 awk 将三个或更多空行“收缩”成两行以获取字符串

"1\n2\n\n3\n\n4\n\n2\n\n3\n\n1\n"

有人有想法吗?

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    awk

    $ awk -v RS= -v ORS='\n\n' 1 file
    

    【讨论】:

      【解决方案2】:

      如果 perl 是可以接受的,

      perl -00 -lpe1
      

      应该这样做。它读取并输出整个段落,其副作用是将 2+ 换行符规范化为 \n\n。

      【讨论】:

      • 很遗憾 perl 是不可接受的,但非常感谢您的回答。
      • @PowerCwel 查看 karakfa 的答案,基本上是一样的,但在 awk 中。
      • 我已经检查过了。谢谢你们。
      【解决方案3】:

      如果数据不是太多并且您有GNU sed,请使用sed -z 使其适用于单个以null 终止的记录,而不是每行一个\n-终止的记录:

      sed -z 's/\n\n\n\n*/\n\n/g'
      

      或者使用扩展的正则表达式:

      sed -zr 's/\n{3,}/\n\n/g'
      

      【讨论】:

      • 是的,您的解决方案有效!我认为我们可以使用你的想法来做更一般的事情。你觉得sed -z 's/\(\n\)\{3\}\n*/\n\n/g' 怎么样?
      • @PowerCwel 我至少会避免捕获组,s/\n\{3\}\n*/\n\n/g 应该是等效的。 's/\n{3,}/\n\n/g' 是 IMO 更漂亮,但它需要 -r 或 -E 标志。
      • 我想你想把十个或更多的字符变成四个的情况。
      • @PowerCwel 我明白了,那么我推荐扩展的正则表达式版本,但你必须在替换模式中编写每个单独的字符
      • 好的,我会按照你的建议去做。谢谢你的回答。
      猜你喜欢
      • 2012-08-13
      • 2011-03-12
      • 2012-01-01
      • 2019-04-20
      • 2012-02-10
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      相关资源
      最近更新 更多