如何使用awk打印除文件中的图案之前的行之外的所有行

时间:2013-07-22 01:52:27

标签: perl printing sed awk

我们怎么能用awk做到这一点?

输入文件

Line 1
Line 2
####PATTERN####### (Line 3)
Line 4
Line 5
Line 6
####PATTERN####### (line 7)
Line 8
####PATTERN####### (Line 9)

等。

输出文件

Line 1
Line 3
Line 4 
Line 5
Line 7
Line 9

3 个答案:

答案 0 :(得分:2)

sed '$!N;s/.*####PATTERN####### \(.*\)/\1/;P;D' text

输出

Line 1
(Line 3)
Line 4
Line 5
(line 7)
(Line 9)

N命令从输入到模式空间中抓取下一行,以便我们可以对两行执行模式匹配。如果我们在中间发现####PATTERN######,我们只保留第二部分,以便删除上一行。 P命令打印结果模式。

答案 1 :(得分:2)

的代码:

sed -nr '/####PATTERN#######/!{x;1!p;x};$p;h' file

$ sed -nr '/####PATTERN#######/!{x;1!p;x};$p;h' file
Line 1
####PATTERN####### (Line 3)
Line 4
Line 5
####PATTERN####### (line 7)
####PATTERN####### (Line 9)

GNU代码

awk '{if ($0 ~ /PATTERN/ && NR>1) {delete l[(NR-1)]}; l[NR]=$0}END {for (a in l) print l[a]}' file
$ awk '{if ($0 ~ /PATTERN/ && NR>1) {delete l[(NR-1)]}; l[NR]=$0}END {for (a in l) print l[a]}' file
Line 1
####PATTERN####### (Line 3)
Line 4
Line 5
####PATTERN####### (line 7)
####PATTERN####### (Line 9)

答案 2 :(得分:1)

以下是awk的一种方式:

awk '/PATTERN/{for(;i<NR-2;)print lines[++i];i=NR;delete lines;print $0}{lines[NR]=$0}' file

输出:

$ cat file
Line 1
Line 2
####PATTERN####### (Line 3)
Line 4
Line 5
Line 6
####PATTERN####### (line 7)
Line 8
####PATTERN####### (Line 9)
$ awk '/PATTERN/{for(;i<NR-2;)print lines[++i];i=NR;delete lines;print $0}{lines[NR]=$0}' file
Line 1
####PATTERN####### (Line 3)
Line 4
Line 5
####PATTERN####### (line 7)
####PATTERN####### (Line 9)