如果下一行以单词字符开头,则用 space 替换新行

replace new line with a space if next line starts with a word character

我有一个大文本文件,看起来像

some random : demo text for
illustration, can be long

and : some more

here is : another
one

我想要这样的输出

some random : demo text for illustration, can be long
and : some more
here is : another one

我尝试了一些奇怪的、明显有问题的正则表达式,比如 %s/\w*\n/ /g,但无法真正理解。

使用您显示的示例,请尝试以下 awk 代码。使用 RS(记录分隔符),将其设置为无效。这仅基于您显示的示例。

awk -v RS="" '{=} 1' Input_file

添加另一个解决方案,以防有人使用 awk 寻找 printf 函数。虽然 中提供的第一个解决方案应该使用恕我直言,但作为替代方案,也可以在此处添加这些解决方案。

第二个解决方案: 添加解决方案以检查行是否以字母开头,然后仅将它们添加到前面的行左右。

awk '{printf("%s%s",[=10=]~/^[a-zA-Z]/?(FNR>1 && prev~/^[a-zA-Z]/?OFS:""):ORS,[=10=]);prev=[=10=]} END{print ""}' Input_file

第三个解决方案: 注意:只有当您的行中有冒号时,这才有效,如所示示例。

awk '{printf("%s%s",[=11=]~/:/?(FNR>1?ORS:""):OFS,[=11=])} END{print ""}'  Input_file

解释:使用awkprintf函数。然后使用条件,如果当前行有 : 并且大于 1,则打印 ORS,否则不打印任何内容。如果行不包含 : 则为每行打印 OFS 。在此程序打印换行符的 END 块中。