首页 > 解决方案 > 如何将多行合并为单行,但仅适用于由空行分隔的行块

问题描述

我正在尝试将多行合并为单行,但有附加条件。

我的输入文件如下所示:

Dm1*(  stuff1 + stuff2 -
stuff3 + stuff4)

+ D1*(D1stuff1 + D1sstuff2 + D1stuff3 + D1stuff4 +
  D1stuff5 - 
  D1stuff6 )

+ D2*(D2stuff)

所以有多行也用空行分隔。所有的都*stuff*包含长而复杂的表达式,也可以包含括号。

我想保持空白行不变,但合并其他多行。

预期的输出是

Dm1*(  stuff1 + stuff2 - stuff3 + stuff4)

+ D1*(D1stuff1 + D1sstuff2 + D1stuff3 + D1stuff4 + D1stuff5 - D1stuff6 )

+ D2*(D2stuff)

当前的所有尝试都像

awk '{printf("%s",$0)}' 

将所有内容放在一行中。我应该遍历行还是有什么方法可以识别空白行之间的块并将其应用到其中?

标签: bashawksedsh

解决方案


甚至比 John1024 的版本短一点

awk 'BEGIN { RS=""; ORS="\n\n"}{$1=$1}1'

或者

awk -v RS="" -v ORS="\n\n" '{$1=$1}1'

UsingRS=""告诉 awk 使用任何段落作为记录(即由空行分隔的文本块)。但它也告诉 awk <newline> 始终是与FS. 通过重新定义输出记录分隔符,我们可以通过告诉 awk通过重置第一条记录ORS来重新定义它的记录来输出您想要的所有内容。这样做的效果是,由(此处为默认值)定义的所有字段分隔符和换行符(由于)被替换为(默认为 <space;>)。最后我们打印记录$0$1=$1FSRS=""OFS1

额外设置时可以去掉所有空格OFS=""

RS字符串值的第一个字符RS应为输入记录分隔符;<newline> 默认情况下。如果RS包含多个字符,则结果未指定。如果RSnull,则记录由 <newline> 加上一个或多个空行组成的序列分隔,前导或尾随空行不应导致输入的开头或结尾处为空记录,并且 <newline> 应始终为一个字段分隔符,不管它的值FS是什么。

来源:POSIX awk 标准


推荐阅读