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