sedやgrepなどを使ってLinux/UNIXでダブルクォーテーション・シングルクォーテーションに囲まれた文字列を抽出する
Pocket

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
Sponsored Links

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

Pocket

Written by blacknon

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

Leave a Comment

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