Re: [問題] regular expression 小問題
※ 引述《decken (HAHAHA~)》之銘言:
: 大家好,
: 有一份文件(https://goo.gl/2Vc3Ui):
: 146460673
: PING 10.0.0.6 (10.0.0.6): 56 data bytes
: 想要把146460673及56抓出來,
: 自己試過下列的regular expression:
: cat short_measurement_PING.txt | sed -r 's/([0-9]+).*PING.*([0-9]+) data bytes/\1 \2/g'
: cat short_measurement_PING.txt | sed -r 's/([0-9]+)$.*PING.*([0-9]+) data bytes/\1 \2/g'
: cat short_measurement_PING.txt | sed -r 's/^([0-9]+)$^.*PING.*([0-9]+) data bytes/\1 \2/g'
: 不過完全沒作用,
: 想請問大家有什麼建議嗎?
: 謝謝~
GNU sed only (應該)
sed -r '/^[0-9]+$/ N; s/([0-9]+)\n[^:]*: *([0-9]+).*/\1 \2/'
/^[0-9]+$/ N
^ 代表行開始, $ 代表行結束, N 會把下一行的資料抓進來
=> 符合單行僅有數字時把下一行資料抓進來,並加上 \n
=> 原本的 pattern space 為 146460673
現在變成 146460673\nPING 10.0.0.6 (10.0.0.6): 56 data bytes
s/([0-9]+)\n[^:]*: *([0-9]+).*/\1 \2/
這行為 extended regular expression
所以需要加 -r flag, 且括號不用加反斜線
因為用到 + operator 所以才需要 e-regex
+ 代表至少符合一個以上
--
推
04/16 19:23,
04/16 19:23
推
04/16 19:42,
04/16 19:42
推
04/16 21:50,
04/16 21:50
→
04/16 21:53,
04/16 21:53
推
04/16 22:20,
04/16 22:20
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.181.25
※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1464757148.A.A5E.html
推
06/01 16:31, , 1F
06/01 16:31, 1F
推
06/01 16:41, , 2F
06/01 16:41, 2F
fix typo
剛剛去問男人發現其實 + 在 GNU sed & grep basic regex 裡其實是有支援的
只是跟 () 一樣要加 backslash
所以可以寫成 sed '/^[0-9]\+$/ N; s/\([0-9]\+\)\n[^:]*: *\([0-9]\+\).*/\1 \2/'
不過 + 並不是 POSIX Basic regex 標準,這應該是 GNU Extension
POSIX Extended Regex 確定有 +
※ 編輯: s25g5d4 (140.117.181.25), 06/01/2016 17:22:24
推
06/02 17:11, , 3F
06/02 17:11, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):