Bash / sed:删除除匹配之外的所有文本文件{es}

时间:2017-05-27 12:30:14

标签: 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 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中运行。我在哪里弄错了?我的想法很少,所以您的意见得到了高度赞赏!

谢谢, 克里斯

3 个答案:

答案 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