BASH:在文本之间查找换行符并用两个换行符替换

Posted

技术标签:

【中文标题】BASH:在文本之间查找换行符并用两个换行符替换【英文标题】:BASH: Find newlines in between text and replace with two newlines 【发布时间】:2020-04-17 09:43:51 【问题描述】:

我希望以编程方式编辑 .txt 文件的换行符。所需的行为是文本行之间的任何单个换行符都将变为两个换行符。

编辑(@kaan 澄清):由一个换行符分隔的行应由两个换行符分隔。任何已经被两行或多行分隔的行都应该保持原样

编辑(上下文):我正在使用 .fountain 语法和一个名为 afterwriting 的 npm 模块,该模块将文本文件导出为 pdf 的脚本格式。使用该包打印为 pdf 时,仅由一个新行分隔的文本行没有正确间隔。所以我想自动将单个换行符转换为双行,因为我也不想在我正在转换的所有文件中添加两个新行

例如,输入示例如下所示:

File with text in it

A new line

Another new line



Line with three new lines above

One last new line

会变成

File with text in it


A new line


Another new line



Line with three new lines above


One last new line

任何关于如何在 bash 脚本中实现这一点的想法将不胜感激

【问题讨论】:

如果已经有 2 条新行,则改为 4 条? 看起来由 一个 分隔的两行换行符应该由 two 分隔。任何已经被两行(或更多)行分隔的行都应保持原样。 这不是一个定义明确的问题。您是否只是想用 3 个换行符替换恰好两个换行符的运行,或者您是否还想用 2 个空白行替换任何孤立的空白行(即只包含空格的行)?也就是说,你对待^$^\s+$ 有区别吗?准确地回答问题,答案就会变得相当明显。 @WilliamPursell 抱歉,我根本没有解释清楚。卡恩是正确的。我正在编辑 og 帖子以进行澄清和上下文 你试过什么?错误信息是什么? 【参考方案1】:

这可能对你有用(GNU sed):

sed '/\S/b;N;//P;b;:a;n;//!ba' file

此解决方案将另一行附加到遇到的第一个空行。如果附加的行不是空的,它会打印第一行并退出,从而使空行加倍。否则,如果附加的行是空的,它会同时打印它们,然后再打印任何空行,直到遇到非空行。

【讨论】:

我收到错误extra characters at the end of g command。我尝试了一些添加分号的变体来尝试修复错误,但都没有成功 这也是我不确定的。研究该错误消息给我带来了很多东西,但不清楚为什么它会显示在这个命令中 对不起,我不知道 sed 的 OSX 版本是不同的,正如@kaan 在我安装 gsed 的另一个答案中推荐的那样(gridlab-d.sourceforge.net/wiki/index.php/Mac_OSX /Gsed 现在完美运行,谢谢【参考方案2】:

这是一种使用sed的方法:

读取整个文件(自normal sed behavior will remove all newlines) 查找单词边界 (\b) 后跟两个换行符 (\n\n – 一个用于结束当前行,一个是单个空白行),然后是另一个单词边界 (\b)李> 对于任何匹配项,请在其中添加一个额外的换行符。

data.txt 中使用您的示例文本,它看起来像这样:

sed -n 'H; $x; s/\b\n\n\b/\n\n\n/g; p' < data.txt | tail -n +2

(编辑:添加 | tail -n +2 以删除在开头插入的额外换行符)

【讨论】:

您在开头打印了 1 个空白行。 刚刚更新了示例。一开始我没有注意到额外的换行符,在快速扫描中我没有发现sed 命令有任何明显的问题,所以我在末尾添加了tail @kaan 当我按上述方式运行它时,我收到错误sed: 1: "H; $x; s/\b\n\n\b/\n\n ...": extra characters at the end of p command。我尝试在p 之后添加一个分号,例如sed -n 'H; $x; s/\b\n\n\b/\n\n\n/g; p;' &lt; test.txt | tail -n +2,但它只是打印文件并且不会改变任何内容 您使用的是什么操作系统? Mac OS X 默认使用 BSD version of sed,它不支持各种东西(与 GNU sed 不同)。 @kaan 谢谢,我不知道这个区别。我安装了 gsed (gridlab-d.sourceforge.net/wiki/index.php/Mac_OSX/Gsed) 现在它可以完美运行了

以上是关于BASH:在文本之间查找换行符并用两个换行符替换的主要内容,如果未能解决你的问题,请参考以下文章

谁会用UE去掉换行和空格

如何去掉excel单元格中的回车键,请不要说取消自动换行。

excel 批量替换换行符

记事本怎么换行

把记事本里所有的空格替换为换行怎么弄的?

使用 tr 用空格替换换行符[重复]