我有一个文本文件,我需要从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 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
我尝试匹配<{p>>行中的142
1.TMI IS 142 AND OPERATORS ARE REMINDED TO INCLUDE THE
匹配始终是一个数字(一到三位数,可能有前导零),并且始终以TMI IS
开头。
到目前为止,我的实验一无所获:我在bash脚本中使用以下.*TMI IS ([0-9]+).*
命令尝试sed
sed -n 's/.*TMI IS \([0-9]+\).*/\1/g' input.txt > output.txt
但只有空output.txt
。
我的脚本在GNU Bash-4.2
中运行。我在哪里弄错了?我的想法很少,所以您的意见得到了高度赞赏!
谢谢, 克里斯
答案 0 :(得分:3)
关于 sed 方法的两个时刻让它发挥作用:
+
量词应在 sed 基本正则表达式中转义
打印匹配的模式使用p
子命令:
sed -n 's/.*TMI IS \([0-9]\+\).*/\1/gp' input.txt
142
要仅获取当前格式的第一个匹配,请使用:
sed -n 's/^\S\+TMI IS \([0-9]\+\).*/\1/gp' input.txt
答案 1 :(得分:1)
使用GNU grep:
$ grep -oP 'TMI IS \K([0-9]*)' input.txt
142
答案 2 :(得分:0)
您也可以使用perl
替代上述内容:
$ perl -nle 'print $1 if /TMI IS (\d+)/;' < input.txt
142