2017-05-27 135 views
1

我有一個文本文件,我需要從bash腳本中提取匹配。可能有不止一場比賽,其他一切都應該被丟棄。的input.txt文件內容Bash/sed:刪除除了匹配以外的所有文本文件

示例代碼段:

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 

我嘗試從線

1.TMI IS 142 AND OPERATORS ARE REMINDED TO INCLUDE THE 

匹配始終是一個號碼匹配142(一到三個數字,可能有前導零)並始終在TMI IS之前。

我的實驗,至今沒有得到什麼:我在bash腳本

sed -n 's/.*TMI IS \([0-9]+\).*/\1/g' input.txt > output.txt 

試圖.*TMI IS ([0-9]+).*用下面的命令sed但只得到了一個空output.txt

我的腳本運行在GNU Bash-4.2。我在哪裏犯我的錯誤?我用完了想法,所以你的意見非常感謝!

謝謝, 克里斯

的sed方法,使
+0

爲什麼不使用grep? – stark

回答

3

兩個時刻它的工作:

  • +量詞應該逃過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 
+0

也許值得一提的是,'\ +'是一個GNU sed擴展。 ''[0-9] [0-9] *'或'[0-9] \ {1,\}'可以用來代替。 – SLePort

+0

2個匹配的TMI IS 321 TMI IS 123'如何?你的'g'建議採取全局行動,但第一個'。*'是貪婪的,你只能得到第二個匹配。 –

+0

@WalterA,爲當前固定格式添加命令 – RomanPerekhrest

1

隨着GNU的grep:

$ grep -oP 'TMI IS \K([0-9]*)' input.txt 
142 
+0

雖然這是使用GNU擴展,所以如果你沒有GNU grep –

+0

謝謝你@EricRenouf不會工作。我編輯了我的答案。 – SLePort

0

你也可以做到這一點使用perl作爲替代上述:

$ perl -nle 'print $1 if /TMI IS (\d+)/;' < input.txt 
142 
相關問題