Re: [問題] regular expression 小問題

看板Linux作者 (function(){})()時間9年前 (2016/06/01 12:59), 9年前編輯推噓3(300)
留言3則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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,
招喚obov
04/16 19:23

04/16 19:42,
樓下obov
04/16 19:42

04/16 21:50,
樓下obov
04/16 21:50

04/16 21:53,
上面好多obov 樓下繼續當obov
04/16 21:53

04/16 22:20,
恩 沒問題 繼續當obov
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
有RegExp版
06/02 17:11, 3F
文章代碼(AID): #1NJckSfU (Linux)
文章代碼(AID): #1NJckSfU (Linux)