使用sed删除每第n行的换行符

时间:2015-08-19 01:19:19

标签: linux bash sed

示例:对于每3n + 1和3n + 2行,是否有办法使用sed删除/替换文件中的模式?

例如,转动

Line 1n/
Line 2n/
Line 3n/
Line 4n/
Line 5n/
Line 6n/
Line 7n/
...

Line 1 Line 2 Line 3n/
Line 4 Line 5 Line 6n/
...

我知道这可能是由awk处理的。但是sed怎么样?

3 个答案:

答案 0 :(得分:6)

好吧,我只使用awk作为 1 ,因为它有点复杂但是,如果你真的打算使用sed,那么下面的命令将三行的组合成一行(根据标题和文本,它看起来就像你所追求的那样,尽管/n对换行的使用很奇怪):

sed '$!N;$!N;s/\n/ /g'

请参阅以下成绩单,了解如何测试:

$ printf 'Line 1\nLine 2\nLine 3\nLine 4\nLine 5\n' | sed '$!N;$!N;s/\n/ /g'
Line 1 Line 2 Line 3
Line 4 Line 5

子命令如下:

  • $!N会将下一行追加到模式空间,但前提是你不在最后一行(你这样做两次才能获得三行)。模式空间中的每一行都用换行符分隔。
  • s/\n/ /g用空格字符替换模式空间中的所有换行符,有效地将这三行组合成一行。

1 类似于:

awk '{if(NR%3==1){s="";if(NR>1){print ""}};printf s"%s", $0;s=" "}'

由于您不希望每行末尾有一个无关的空间,因此需要引入s变量,这很复杂。

由于sed变体较小(一旦你理解它就不那么复杂),你可能最好不要坚持使用它。好吧,至少要达到你希望组合17行的组合,或做一些比sed更复杂的事情的意思是处理: - )

答案 1 :(得分:1)

该示例用于合并3个连续的行,尽管描述不同。要生成示例输出,您可以使用awk idiom

  awk 'ORS=NR%3?FS:RS' <(seq 1 9)  
  1 2 3
  4 5 6
  7 8 9

在您的情况下,需要预先定义记录分隔符以包含文字

awk -v RS="n/\\n" 'ORS=NR%3?FS:RS'

答案 2 :(得分:0)

确定。以下是使用awk和sed处理它的方法。

AWK:

awk 'NR % 3 { sub(/pattern/, substitution) } { print }' file | paste -d' ' - - -

sed的:

sed '{s/pattern/substitution/p; n;s/pattern/substitution/p; n;p}' file | paste -d' ' - - -

他们都将3n+13n+2行中的模式替换为substitution并保持3n行不受影响。

paste - - -是将stdout折叠3的bash惯用法。