正規表現


URLのrcodeパラメータの値を取得

$ cat url.txt | sed -e 's/^.*[?&]rcode=\([^&]*\).*/\1/g'
 ^  .*  [?&]  \([^&]*\)
先頭 0文字以上の任意の文字列 ? or & & 以外の任意の文字列を後方参照(rcode=から&の間の文字列を取り出す)
[url.txt]
http://biz.travel.yahoo.co.jp/bin/msearch?rcode=capital_outline&ktype=0&jtype=1&fo=h
http://biz.travel.yahoo.co.jp/bin/msearch?ktype=0&jtype=1&rcode=capital_outline&fo=h
http://biz.travel.yahoo.co.jp/bin/msearch?ktype=0&jtype=1&fo=h&rcode=capital_outline
 ↓
capital_outline
capital_outline
capital_outline

最初に現れる「:」までにマッチさせる

#!/bin/sh
echo "aaabbb:ccc:ddd" | sed -e 's/\([^:]*\).*/\1/'
 \([^:]*\)
:以外の任意の文字列を後方参照
$ ./test.sh
aaabbb

 

#!/usr/bin/perl
my $str = "aaabbb:ccc:ddd";
if ($str =~ /(.*?):/){
  print $1, "\n";
 }
 (.*?)
? を付けると最短マッチになる。付けないと最長マッチ(aaabbb:ccc)になる
$ perl test.pl
aaabbb

URLにマッチさせたい

#!/usr/bin/perl
while (my $line = <STDIN>){
  chomp($line);
  if ($line =~ /(https?|ftp):\/\/([^:\/]+)(?::(\d+))?(\/.*)?/){
    print $2 . ($3 ? ":$3" : ''), "\n";
  }
}
 (https?|ftp)  ([^:\/]+)  (?::(\d+))?
http(sがついても付かなくてもマッチ)、またはftp  : , / 以外の1文字以上の任意の文字列  (?:hoge)は非キャプチャ。:(\d+)で1文字以上の数値(ポート番号)をキャプチャ。末尾の? でポート番号があってもなくてもマッチ
[url.txt]
https://www.google.co.jp
http://auctions.yahoo.co.jp:80/
http://biz.travel.yahoo.co.jp/bin/msearch
$ cat url1.txt | perl test.pl 
www.google.co.jp
auctions.yahoo.co.jp:80
biz.travel.yahoo.co.jp