bash - 如何将多行合并为单行,但仅适用于由空行分隔的行块
问题描述
我正在尝试将多行合并为单行,但有附加条件。
我的输入文件如下所示:
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)}'
将所有内容放在一行中。我应该遍历行还是有什么方法可以识别空白行之间的块并将其应用到其中?
解决方案
甚至比 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=$1
FS
RS=""
OFS
1
额外设置时可以去掉所有空格OFS=""
RS
字符串值的第一个字符RS
应为输入记录分隔符;<newline> 默认情况下。如果RS
包含多个字符,则结果未指定。如果RS
是null
,则记录由 <newline> 加上一个或多个空行组成的序列分隔,前导或尾随空行不应导致输入的开头或结尾处为空记录,并且 <newline> 应始终为一个字段分隔符,不管它的值FS
是什么。来源:POSIX awk 标准
推荐阅读
- regex - Google 表格查询包含逗号的行
- web - 如何修复:未捕获(承诺中)错误:无效元素 ID:字符串长度:[1,255]。仅限 ASCII 字符。在 agora.io SDK
- react-portal - react-portal onOpen 未触发
- list - Haskell中的长度函数问题
- sql - Oracle 在 2 个表中返回值
- laravel-5 - 更新作曲家后所有显示 git 的供应商文件
- php - php预匹配。查找两个值不按顺序排列的元素
- android - Google AdMob 广告未在真实设备中显示,但在模拟器中运行
- python - 在 Pycharm 编辑器中,MySQL 命令“显示数据库”在运行后不返回结果或错误?
- python - 带有 GMT 值的 Django Pytz 时区全名