grepでurl(http/https)を抽出する正規表現(url途中で改行がある場合)

Twitterをボケーッと見てたところ、そんな感じの処理についてしたいというツイート見かけたので、備忘で残しておく。
urlの箇所をgrepするだけであれば、以下のように正規表現を記述してやればいい。
※マルチバイト非対応。日本語を含む場合はパーセントエンコーディングである必要あり。

grep -zoP -- 'http(s?)://[0-9a-zA-Z?=#+_&:/.%]+'
blacknon@BS-PUB-DEVELOP:~$ cat test_url1.list
<xxx="http://example.com">
yyy="https://example.co.jp/test/" ,test,test
test!='https://example.net/search?hl=ja&q=%U&lr='
blacknon@BS-PUB-DEVELOP:~$ cat test_url1.list | grep -zoP 'http(s?)://[0-9a-zA-Z?=#+_&:/.%]+'
http://example.com
https://example.co.jp/test/
https://example.net/search?hl=ja&q=%U&lr=
Sponsored Links

で、もしurlが途中で改行で区切られている場合。
この場合は、とりあえずgrepでurlとみなす文字種(↑で[]で囲んでるやつ)に\n(改行)を追加してやればいい。

grep -zoP -- 'http(s?)://[0-9a-zA-Z?=#+_&:/.%\n]+'
blacknon@BS-PUB-DEVELOP:~$ cat test_url2.list
<xxx="http://example.com">
yyy="https://example.co.jp/
test/" ,test,test
test!='https://example.net/search?hl=
ja&q=%U&lr='
url is https://example.net/search?hl=
ja&q=%U&lr=
blacknon@BS-PUB-DEVELOP:~$ cat test_url2.list | grep -zoP -- 'http(s?)://[0-9a-zA-Z?=#+_&:/.%\n]+'
http://example.com
https://example.co.jp/
test/
https://example.net/search?hl=
ja&q=%U&lr=
https://example.net/search?hl=
ja&q=%U&lr=

 

ただ、これだと抽出されたurlにいまだ改行が残ってしまっている状態。
だからといって、ただ単純にパイプで繋いで改行を削除すると全部の改行が消えてしまうので、grep抽出時に事前に抽出ファイル名の横にnull文字を差し込んでやり、それを使って検索結果の改行のみを置換して表示させる。

grep -H -zZoP 'http(s?)://[0-9a-zA-Z?=#+_&:/.%\n]+' | sed '/\x0/s/^/\x0/g' | tr -d '\n' | sed 's/\x0/&\n/g;s/$/\n/g'
blacknon@BS-PUB-DEVELOP:~$ cat test_url2.list | grep -H -zZoP 'http(s?)://[0-9a-zA-Z?=#+_&:/.%\n]+' | sed '/\x0/s/^/\x0/g' | tr -d '\n' | sed 's/\x0/&\n/g;s/$/\n/g'
(標準入力)
http://example.com
(標準入力)
https://example.co.jp/test/
(標準入力)
https://example.net/search?hl=ja&q=%U&lr=
(標準入力)
https://example.net/search?hl=ja&q=%U&lr=

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*