每 N 行删除换行符

每 N 行删除换行符

处理文本,我需要每两行删除换行符。

示例文本:

this is line one
and this is line two
the third and the
fourth must be pasted too

期望的输出:

this is line one and this is line two
the third and the fourth must be pasted too

我尝试了一个while循环,但 while 循环是不好的做法。是否可以使用tr或任何其他命令来完成此操作?

答案1

paste(也是一个标准的 POSIX 简单实用程序,例如tr)是您的工具。

假设您希望将这些换行符替换为空格,而不仅仅是已删除如您的样本中所示:

paste -d ' ' - - < file

或者:

paste -sd ' \n' file

如果您确实希望将其删除,请替换' '为。'\0'

要替换 3 个中的 2 个:

paste -sd '  \n' file

3 中的 1,从第二个开始:

paste -sd '\n \n' file

等等。

另一个好处paste是它不会留下未终止的线路。例如,如果您删除每一个文件中的换行符(与tr -d '\n' < file或 一样tr '\n' ' ' < file),最终根本没有任何行,因为行需要以换行符终止。因此,通常最好使用paste它(如paste -sd '\0' filepaste -sd ' ' file),这将添加有效文本所需的尾随换行符。

答案2

与现代GNU sed

sed -rz 's/\n([^\n]*\n)/ \1/g' sample.text

awk

awk '{getline line2;print $0, line2}' sample.text

答案3

sed为此使用如下所示:

SHW@SHW:/tmp $ cat a
this is line one
and this is line two
the third and the
fourth must be pasted too

SHW@SHW:/tmp $ sed 'N;s/\n/ /' a -i

SHW@SHW:/tmp $ cat a
this is line one and this is line two
the third and the fourth must be pasted too

答案4

另一种方法是使用xargs

$ < txt xargs -d '\n' -n 2 echo
this is line one and this is line two
the third and the fourth must be pasted too

在哪里

$ cat txt
this is line one
and this is line two
the third and the
fourth must be pasted too

虽然,这个解决方案相当过度,因为echo每行都会执行一个进程......因此,除了玩具示例之外,基于 awk/sed 或类似的解决方案应该是首选。

相关内容