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
的方法:
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;' < 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:在文本之间查找换行符并用两个换行符替换的主要内容,如果未能解决你的问题,请参考以下文章