如何将多行合并为一行,但仅适用于由空白行分隔的行块

Boo*_*man 4 bash awk sed sh

我正在尝试将多行合并为一条,但要附加其他条件。

我的输入文件如下所示:

Dm1*(  stuff1 + stuff2 -
stuff3 + stuff4)

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

+ D2*(D2stuff)
Run Code Online (Sandbox Code Playgroud)

因此,存在多行也由空白行分隔的行。所有*stuff*包含长而复杂的表达式,也可以包含括号。

我想保留空白行,但合并其他多行。

预期的输出是

Dm1*(  stuff1 + stuff2 - stuff3 + stuff4)

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

+ D2*(D2stuff)
Run Code Online (Sandbox Code Playgroud)

当前所有尝试

awk '{printf("%s",$0)}' 
Run Code Online (Sandbox Code Playgroud)

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

kva*_*our 5

甚至比John1024的版本短一点

awk 'BEGIN { RS=""; ORS="\n\n"}{$1=$1}1'
Run Code Online (Sandbox Code Playgroud)

要么

awk -v RS="" -v ORS="\n\n" '{$1=$1}1'
Run Code Online (Sandbox Code Playgroud)

使用RS=""告诉awk将任何段落用作记录(即,用空白行分隔的一段文本)。但这也告诉awk,<newline>始终是与结合使用的字段分隔符FS。通过重新定义输出记录分隔符ORS,我们可以$0通过重置第一个记录来告诉awk重新定义其记录,从而根据需要输出所有内容$1=$1。这样做的效果是,由FS(此处为默认值)和换行符(由于RS="")定义的所有字段分隔符均被OFS(默认为<space;>)替换。最后我们用1

额外设置后,您可以摆脱所有空格 OFS=""

RS字符串值的第一个字符RS应为输入记录分隔符;默认情况下为<newline>。如果RS包含多个字符,则结果不确定。如果RS为is null,则记录由由<newline>加上一个或多个空行组成的序列分隔,开头或结尾的空行在输入的开头或结尾不应导致空记录,并且<newline>始终为字段分隔符,无论其值FS是多少。

来源:POSIX awk标准