我想使用grep
,awk
或提取匹配模式后的第 N 行sed
。
例如我有这段文字:
Revision:
60000<br />
我想提取60000。
我尝试Revision:([a-z0-9]*)\s*([0-9]){5}
了将修订版与修订号匹配,但是当我将它传递给 grep 时:grep Revision:([a-z0-9]*)\s*([0-9]){5} file.html
我什么也没得到。
我怎样才能做到这一点?
给extract the Nth line after a matching pattern
你想要的:
awk 'c&&!--c;/pattern/{c=N}' file
例如
awk 'c&&!--c;/Revision:/{c=5}' file
将在文本 "Revision:"/ 之后打印第 5 行。
有关详细信息,请参阅使用 sed 或 awk 在匹配模式后打印一行。
在第一个空白/空行之后打印第lnb
th行:
要打印的行索引(在 bash shell 中):
lnb=2
使用sed
:
sed -ne '/^\s*$/{:a;n;0~'"$lnb"'!ba;p;q}' my_file`
使用perl
:
perl -ne '/^\s+$/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,last)' my_file`
在正则表达式匹配后打印第lnb
th行:
使用sed
:
sed -ne '/regex/{:a;n;0~'"$lnb"'!ba;p;q}' my_file
使用perl
:
perl -ne '/regex/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,last)' my_file
奖励 1,Windows PowerShell(先安装 Perl):
$lnb=2
perl -ne "/regex/ && `$k++;`$k!=0 && `$k++ && `$k==$lnb+2 && (print,last)" my_file
奖励 2,Windows DOS 命令行:
set lnb=2
perl -ne "/regex/ && $k++;$k!=0 && $k++ && $k==%lnb%+2 && (print,last)" my_file
在正则表达式匹配后打印所有lnb
行:
使用perl
(bash 示例):
perl -ne '/regex/ && $k++;$k!=0 && $k++ && $k=='"$lnb"'+2 && (print,$k=0)' my_file
我喜欢我可以学习重做的解决方案,而不必每次都用谷歌搜索。这个解决方案并不完美,但使用了我可以从内存中写入的简单 grep 命令。
grep -A7 "searchpattern" file | grep -B1 "^--$" | grep -v "^--$"
您可以在搜索模式之后将 7 更改为您想要的第 n 行。然后它搜索“组分隔符”--
并显示之前的最后一行。然后删除组分隔符。
唯一不能正常工作的情况是如果您的数据包含只有“--”的行。