示例:对于每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怎么样?
答案 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+1
和3n+2
行中的模式替换为substitution
并保持3n
行不受影响。
paste - - -
是将stdout折叠3的bash惯用法。