我希望使用 grep
、awk
或 sed
提取匹配模式后的第 N 行。
例如,我有这段文本:
Revision:
60000<br />
我希望提取60000。
我尝试使用Revision:([a-z0-9]*)\s*([0-9]){5}
来匹配版本和版本号,但是当我将其传递给grep:grep Revision:([a-z0-9]*)\s*([0-9]){5} file.html
时,没有结果。
我该如何实现?
要提取匹配模式后的第N行,您需要:
awk 'c&&!--c;/pattern/{c=N}' file
例如
awk 'c&&!--c;/Revision:/{c=5}' file
将会打印文本“Revision:”后的第5行。
更多信息请参见使用sed或awk打印匹配模式后的行
打印第一个空白行后的lnb
行:
要打印的行索引(在bash shell中):
lnb=2
Using sed
:
sed -ne '/^\s*$/{:a;n;0~'"$lnb"'!ba;p;q}' my_file`
Using perl
:
perl -ne '/^\s+$/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,last)' my_file`
打印正则表达式匹配后的第lnb
行:
Using sed
:
sed -ne '/regex/{:a;n;0~'"$lnb"'!ba;p;q}' my_file
Using perl
:
perl -ne '/regex/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,last)' my_file
Bonus 1, Windows PowerShell (install Perl first) :
$lnb=2
perl -ne "/regex/ && `$k++;`$k!=0 && `$k++ && `$k==$lnb+2 && (print,last)" my_file
Bonus 2, Windows DOS command line :
set lnb=2
perl -ne "/regex/ && $k++;$k!=0 && $k++ && $k==%lnb%+2 && (print,last)" my_file
在正则表达式匹配后打印所有第lnb
行:
Using perl
(bash example):
perl -ne '/regex/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,$k=0)' my_file
我喜欢可以学会重复使用的解决方案,而不必每次都要谷歌搜索。这个解决方案并不完美,但使用了简单的grep命令,我可以从记忆中编写。
grep -A7 "searchpattern" file | grep -B1 "^--$" | grep -v "^--$"
--
并显示该行之前的最后一行。然后删除组分隔符。
c&&!--c
可以等价于c!=0 && --c==0
,而c&&c--
可以等价于c!=0 && --c>=0
;这些替代方法可能更容易理解。 - musiphilawk '/pattern/{p[NR+N]=1} NR in p'
(更简单)或awk '/pattern/{p[NR+N]=1} NR in p{print; delete p[NR]}'
(保持内存使用量有限)。 - musiphilawk '/abc/ {c=0} c++>4' file
- Betlistaawk '/pattern/{c=N} c&&c--{next} 1' file
。而你所写的awk '/abc/ {c=0} c++>4' file
则做了一些完全不同的事情,例如它会无条件地跳过输入的前5行。 - Ed Morton