sedでダブルクォーテーションの中にある文字列を抽出する


概要

  1. sedでダブルクォーテーションの中にある文字列を抽出する
  2. 1.を基に以下を詳細におさらいする
    • 2-1. sedコマンド
    • 2-2. 正規表現

1. sedでダブルクォーテーションの中にある文字列を抽出する

記事がありましたので引用します。
コマンドや正規表現について詳細には書かれておりませんでしたので、2.で確認していきます。

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

2-1. sedコマンドを確認する

sed 's/hoge/piyo/g foo.txt'         #foo.txt中の全てのhogeをpiyoに置換
cat foo.txt | sed 's/hoge/piyo/g'   #foo.txt中の全てのhogeをpiyoに置換

sedは文字列を置換するコマンドです。
s/置換前/置換後/と書くことで置換前の文字列を置換後の文字列に変更できるようになります。
またgをつけることで、置換前の文字列全てを置換できます。(以降は扱いません。)

2-2. 正規表現を確認する

sed 's/^.*"\(.*\)".*$/\1/'

^.*"\(.*\)".*$\1に置換しています。
^.*"\(.*\)".*$を確認してみます。

  • ^:文字列の先頭
  • .*:任意の文字(文字列)
    • .:任意の1文字
    • *:0回以上の繰り返し
  • " ":ダブルクォーテーション
  • \( \):文字列の指定 抽出したい文字列(今回はダブルクォーテーション)の内側に記載
  • $:文字列の末尾

「文字列の先頭^から末尾$まで」、つまり「文字列全体」を置換の対象にしており、
" "の内側の文字列を\( \)で括っています。
これにより、\( \)の内側の文字列を\1という変数に抽出できます。
例えば、\(hoge\)foo\(bar\)を考えてみると、

  • \1=hoge
  • \2=bar

になります。
以上から、\( \)内の文字列が\1に抽出し、文字列全体を抽出した文字列に置換しています。

確認ですが、上記方法での置換例を挙げると、

  • aaa="bbb" -> bbb
  • hoge"foo"hoge -> foo

になりますね。

以上です。読んでいただき、ありがとうございました。

参考