Regex Bash/sed:删除文本文件中除匹配项以外的所有内容
我有一个文本文件,需要在bash脚本中从中提取匹配项。可能会有不止一个匹配项,其他所有匹配项都应该被丢弃Regex Bash/sed:删除文本文件中除匹配项以外的所有内容,regex,bash,sed,Regex,Bash,Sed,我有一个文本文件,需要在bash脚本中从中提取匹配项。可能会有不止一个匹配项,其他所有匹配项都应该被丢弃 input.txt文件内容的示例片段: PART TWO OF TWO PARTS- E RESNO 56/20 56/30 54/40 52/50 TUDEP EAST LVLS NIL WEST LVLS 310 320 330 340 350 360 370 380 390 EUR RTS WEST NIL NAR NIL- REMARKS. 1.TMI IS 142 AND OPER
input.txt
文件内容的示例片段:
PART TWO OF TWO PARTS-
E RESNO 56/20 56/30 54/40 52/50 TUDEP
EAST LVLS NIL
WEST LVLS 310 320 330 340 350 360 370 380 390
EUR RTS WEST NIL
NAR NIL-
REMARKS.
1.TMI IS 142 AND OPERATORS ARE REMINDED TO INCLUDE THE
TMI NUMBER AS PART OF THE OCEANIC CLEARANCE READ BACK.
2.ADS-C AND CPDLC MANDATED OTS ARE AS FOLLOWS
TRACK A 350 360 370 380 390
TRACK B 350 360 370 380 390
我尝试从行中匹配142
1.TMI IS 142 AND OPERATORS ARE REMINDED TO INCLUDE THE
匹配总是一个数字(一到三位数,可能有前导零),并且前面总是有TMI is
到目前为止,我的实验毫无结果:我在bash脚本中使用以下sed
命令尝试*TMI IS([0-9]+).
sed -n 's/.*TMI IS \([0-9]+\).*/\1/g' input.txt > output.txt
但是只得到一个空的output.txt
我的脚本在gnubash-4.2中运行。我在哪里犯错误?我没有主意了,非常感谢你的意见
谢谢,
Chris关于您的sed方法的两个瞬间:
量词应该在sed基本正则表达式中转义+
- 要打印匹配的图案,请使用
子命令:p
要仅获取当前格式的第一个匹配项,请使用:
关于您的sed方法的两个时刻:
量词应该在sed基本正则表达式中转义+
- 要打印匹配的图案,请使用
子命令:p
要仅获取当前格式的第一个匹配项,请使用: 使用GNU grep:
$ grep -oP 'TMI IS \K([0-9]*)' input.txt
142
使用GNU grep:
$ grep -oP 'TMI IS \K([0-9]*)' input.txt
142
您也可以使用
perl
作为上述方法的替代方法:
$ perl -nle 'print $1 if /TMI IS (\d+)/;' < input.txt
142
$perl-nle'if/TMI为(\d+/;)时打印$1'输入文件
142
您也可以使用perl
作为上述方法的替代:
$ perl -nle 'print $1 if /TMI IS (\d+)/;' < input.txt
142
$perl-nle'if/TMI为(\d+/;)时打印$1'输入文件
142
为什么不使用grep?为什么不使用grep?不过这是使用GNU扩展,所以如果没有GNU grep就不起作用。不过,这是使用GNU扩展,如果没有GNU grep就不起作用。值得一提的是,\+
是一个基于GNU的扩展<代码>[0-9][0-9]*或[0-9]\{1,\}
可以改为使用。一行有两个匹配项TMI IS 321 TMI IS 123
如何?你的g
可以得到一个全局操作,但是第一个*
是贪婪的,你只能得到第二个匹配。要打印匹配的模式,你也可以简单地删除-n
标志。也许值得一提的是\+
是一个GNU-sed扩展<代码>[0-9][0-9]*或[0-9]\{1,\}
可以改为使用。一行有两个匹配项TMI IS 321 TMI IS 123
如何?您的g
sug会获得一个全局操作,但是第一个*
是贪婪的,您只会获得第二个匹配。要打印匹配的模式,您也可以简单地删除-n
标志。