我正在尝试打印匹配行和匹配行中的第四行(包含我正在搜索的表达式的行)。
我一直在使用以下代码:
sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt
但这只会打印匹配的行。
这仅打印第四行。
awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt
我只需要打印匹配的行和第四行。
答案1
在 awk 中,你可以这样做
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
或者
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
解释
第一个解决方案找到所有匹配的行pattern
。当它找到匹配项时,它将记录号 ( NR
) 存储在数组中nr
。它还存储NR
同一数组中的第四条记录。这是由nr[NR+4]
.NR
然后检查每个记录 ( ) 以查看它是否存在于nr
数组中,如果存在则打印该记录。
第二个解决方案的工作方式本质上是相同的,除了当它遇到 e 时,pattern
它会打印该行,然后将其前面的第四条记录存储在数组中nr
,然后转到下一条记录。然后,当awk
遇到第四条记录时,该NR in nr
块将被执行,并在之后打印该+4记录。
例子
这是一个示例数据文件,sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
使用第一个解决方案:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
使用第二种解决方案:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14
答案2
您可以尝试-A
使用 选项grep
,该选项指定应打印匹配行之后的行数。将其与 结合起来sed
,您将获得所需的行。
grep -A 4 pattern input.txt | sed -e '2,4d'
使用sed
,我们删除从第二行到第四行的 。
答案3
sed -n 's/^[ \t]*/; /img class=\"devil_icon/,+4 { 3,5d ; p }' input.txt
我只是在打印之前删除适当的行{ 3,5d ; p }
。
答案4
awk 'c&&!--c;/img class=\"devil_icon/{c=4};/img class=\"devil_icon/' input.txt
您本质上是在进行查找和替换。您可以只添加一个寻找到同一个命令中,它会打印它们:)
awk 'c&&!--c;/pattern/{c=4};/pattern/' input.txt