2017-08-04 73 views
2

我想匹配,然後從文本字符串中提取模式。我需要提取其後面的文本字符串匹配任何模式:搜索文本字符串中的模式,然後提取匹配模式

10289 20244 

文本文件:

KBOS 032354Z 19012KT 10SM FEW060 SCT200 BKN320 24/17 A3009 RMK AO2 SLP187 CB DSNT NW T02440172 10289 20244 53009 

我試圖做到這一點使用下面的bash代碼:

Bash代碼:

cat text_file | grep -Eow '\s10[0-9].*\s' | head -n 4 | awk '{print $1}' 

上面的代碼嘗試搜索任何一組大約五個以10後跟三個數字字符開頭的數字字符。匹配此模式後,代碼會打印出文本字符串的其餘部分,從20開始捕獲第二組五個數字字符。

我需要一個更好,更可靠的方法來實現這個目標,因爲目前這段代碼失敗了。我需要的數字組用空格分開。我試圖通過將\s插入代碼的grep部分來解釋這一點。

回答

2

的grep溶液:

grep -Eow '10[0-9]{3}\b.*\b20[0-9]{3}' text_file 

輸出:

10289 20244 

  • [0-9]{3} - 匹配3個位數

  • \b - 單詞邊界下一個

+1

這將匹配'10289 12345 RMX 67890 FOO 20244' - 是否可取? –

0
awk '{print $(NF-2),$(NF-1)}' text_file 

10289 20244 

打印到最後和一個以前。

+0

儘管此代碼片段可能會解決問題,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! – Machavity

0
awk '$17 ~ /^10[0-9]{3}$/ && $18 ~ /^20[0-9]{3}$/ { print $17, $18 }' text_file 

這將檢查字段17的「10xxx」和字段18的「20xxx」,當BOTH匹配時,打印它們。