sedやgrepなどを使って、ダブルクォーテーションやシングルクォーテーションに囲まれた文字列を抽出する方法についてを記述する。
基本的にはsedでいいと思うけど、念のため他のやり方についても書いておく。
1.sed
sedでダブルクォーテーションやシングルクォーテーションに囲まれた文字列を抽出する場合は、以下のようにする。
sed 's/^.*"\(.*\)".*$/\1/' # ダブルクォーテーションの場合 sed "s/^.*'\(.*\)'.*$/\1/" # シングルクォーテーションの場合
blacknon@BS-PUB-UBUNTU-01:~$ echo 'aaa="aaa"' | sed 's/^.*"\(.*\)".*$/\1/' aaa blacknon@BS-PUB-UBUNTU-01:~$ echo "bbb='bbb'" | sed "s/^.*'\(.*\)'.*$/\1/" bbb blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt aaa="aaa123" bbb="bbb234" abc='abc123' def='def456' blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | sed 's/^.*"\(.*\)".*$/\1/' aaa123 bbb234 abc='abc123' def='def456' blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | sed "s/^.*'\(.*\)'.*$/\1/" aaa="aaa123" bbb="bbb234" abc123 def456 blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | sed -n 's/^.*"\(.*\)".*$/\1/p' aaa123 bbb234 blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | sed -n "s/^.*'\(.*\)'.*$/\1/p" abc123 def456
2.grep
grepを使う場合は、以下のようにする。
grep -Po '(?<=")[^",]+(?=")' # ダブルクォーテーション grep -Po "(?<=')[^',]+(?=')" # シングルクォーテーション
blacknon@BS-PUB-UBUNTU-01:~$ echo 'aaa="aaa"' | grep -Po '(?<=")[^",]+(?=")' aaa blacknon@BS-PUB-UBUNTU-01:~$ echo "bbb='bbb'" | grep -Po "(?<=')[^',]+(?=')" bbb blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt aaa="aaa123" bbb="bbb234" abc='abc123' def='def456' blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | grep -Po '(?<=")[^",]+(?=")' aaa123 bbb234 blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | grep -Po "(?<=')[^',]+(?=')" abc123 def456
3.awk
awkでやる場合は、「-F」でデリミタとしてシングルクォーテーション・ダブルクォーテーションを指定してやって抽出できる。
以下の例ではどちらの場合でも区切り文字として扱うようにしているが、問題があるようならばどちらか片方で処理をさせる。
awk -F'['\''"]' '{print $2}'
blacknon@BS-PUB-UBUNTU-01:~$ echo 'aaa="aaa"' | awk -F'['\''"]' '{print $2}' aaa blacknon@BS-PUB-UBUNTU-01:~$ echo "bbb='bbb'" | awk -F'['\''"]' '{print $2}' bbb blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt aaa="aaa123" bbb="bbb234" abc='abc123' def='def456' blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | awk -F'['\''"]' '{print $2}' aaa123 bbb234 abc123 def456
4.perl
sedやgrepでうまくいかない環境(HP-UXとか)であれば、以下のようにperlで抽出してみよう。
perl -lne 'if(/'\"'(.*)'\"'/) {print $1}' # ダブルクォーテーション perl -lne 'if(/'\''(.*)'\''/) {print $1}' # シングルクォーテーション
blacknon@BS-PUB-UBUNTU-01:~$ echo 'aaa="aaa"' | perl -lne 'if(/'\"'(.*)'\"'/) {print $1}' aaa blacknon@BS-PUB-UBUNTU-01:~$ echo "bbb='bbb'" | perl -lne 'if(/'\''(.*)'\''/) {print $1}' bbb blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt aaa="aaa123" bbb="bbb234" abc='abc123' def='def456' blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | perl -lne 'if(/'\"'(.*)'\"'/) {print $1}' aaa123 bbb234 blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | perl -lne 'if(/'\''(.*)'\''/) {print $1}' abc123 def456
5.Ruby
Rubyでやる場合は以下(Ruby入ってるなら、上のどれかは入ってそうだけど)。
ruby -e 'puts STDIN.gets.scan(/"([^"]*)"/)' # ダブルクォーテーション ruby -e "puts STDIN.gets.scan(/'([^']*)'/)" # シングルクォーテーション
複数行ある場合は、以下のように指定する。
ruby -e 'STDIN.each {|line| puts line.scan(/"([^"]*)"/)}' # ダブルクォーテーション ruby -e "STDIN.each {|line| puts line.scan(/'([^']*)'/)}" # シングルクォーテーション
blacknon@BS-PUB-UBUNTU-01:~$ echo 'aaa="aaa"' | ruby -e 'puts STDIN.gets.scan(/"([^"]*)"/)' aaa blacknon@BS-PUB-UBUNTU-01:~$ echo "bbb='bbb'" | ruby -e "puts STDIN.gets.scan(/'([^']*)'/)" bbb blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt aaa="aaa123" bbb="bbb234" abc='abc123' def='def456' blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | ruby -e 'STDIN.each {|line| puts line.scan(/"([^"]*)"/)}' aaa123 bbb234 blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test3.txt | ruby -e "STDIN.each {|line| puts line.scan(/'([^']*)'/)}" abc123 def456