BASH:在文本之间查找换行符并替换为两个换行符
BASH: Find newlines in between text and replace with two newlines
我希望以编程方式编辑 .txt 文件的换行符。期望的行为是文本行之间的任何单个换行符都将变成两个换行符。
编辑(@kaan 澄清):由一个换行符分隔的行应由两个换行符分隔。任何已经被两行或更多行分隔的行都应保持原样
编辑(上下文):我正在使用 .fountain 语法和一个名为 afterwriting 的 npm 模块,该模块将文本文件导出为脚本格式作为 pdf。使用包打印为 pdf 时,仅由一个新行分隔的文本行不能正确 space。所以我想自动将单个换行符转换为双,因为我也不想在我正在转换的所有文件中添加两个新行
例如,输入示例如下所示:
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 脚本中实现这一点的想法都将不胜感激
这是一种使用 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
以删除开头插入的额外换行符)
这可能对你有用 (GNU sed):
sed '/\S/b;N;//{P;b};:a;n;//!ba' file
此解决方案将另一行附加到遇到的第一个空行。如果附加的行不为空,它会打印第一行并退出,从而使空行加倍。否则,如果附加的行是空的,它会打印它们,然后再打印任何空行,直到遇到非空行。
我希望以编程方式编辑 .txt 文件的换行符。期望的行为是文本行之间的任何单个换行符都将变成两个换行符。
编辑(@kaan 澄清):由一个换行符分隔的行应由两个换行符分隔。任何已经被两行或更多行分隔的行都应保持原样
编辑(上下文):我正在使用 .fountain 语法和一个名为 afterwriting 的 npm 模块,该模块将文本文件导出为脚本格式作为 pdf。使用包打印为 pdf 时,仅由一个新行分隔的文本行不能正确 space。所以我想自动将单个换行符转换为双,因为我也不想在我正在转换的所有文件中添加两个新行
例如,输入示例如下所示:
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 脚本中实现这一点的想法都将不胜感激
这是一种使用 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
以删除开头插入的额外换行符)
这可能对你有用 (GNU sed):
sed '/\S/b;N;//{P;b};:a;n;//!ba' file
此解决方案将另一行附加到遇到的第一个空行。如果附加的行不为空,它会打印第一行并退出,从而使空行加倍。否则,如果附加的行是空的,它会打印它们,然后再打印任何空行,直到遇到非空行。