Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash/sed:删除文本文件中除匹配项以外的所有内容_Regex_Bash_Sed - Fatal编程技术网

Regex Bash/sed:删除文本文件中除匹配项以外的所有内容

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

我有一个文本文件,需要在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
我尝试从行中匹配
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
标志。