正規表現
sed
抽出

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


自己紹介

てるさんと申します。

初投稿です。

学んだことをアウトプットしていきます。

クソ記事を量産するかもしれませんが、よろしくお願いします。


概要

タイトルにもありますが、sedでダブルクォーテーションの中にある文字列を抽出してみます。


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は文字を置換するコマンドです。SNSで誤字を訂正する時によく流れてくるやつがこれですね。

初めて知りました。


やり方を調査


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

正規表現だった...分からない...うう...

詳しく見ていきましょう。


正規表現を用いて文字列を抽出

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

^.*"\(.*\)".*$\1で置換するみたいですね。

^.*"\(.*\)".*$を見ていきます。



  • ^:文字列の先頭


  • .:任意の1文字


  • *:0回以上の繰り返し


  • .*:任意の文字(文字列)


  • "":ダブルクォーテーション


  • \(\):文字列の指定 ダブルクォーテーションの内側に記載


  • $:文字列の末尾

つまり、文字列の先頭^から末尾$までを置換の対象にしており、

""の内側の文字列を\(\)で括っているということになります。


また、\1はキャプションと呼ばれるもので、\( \)内の文字列が\1という変数に入れられるみたいです。


例えば、\(hoge\)foo\(bar\)



  • \1=hoge


  • \2=bar

になります。

なので、""の内側で\(\)を書いている理由は、

\( \)内の文字列を\1で抽出できるからですね。


つまり、sedコマンドで文字列全体を抽出したものに置換している

ということになります。

上の例で言うと

aaa="aaa"aaaに置換されますし、

例えば

hoge"foo"hogefoo

になります。


感想

sedが難しいというより正規表現が難しかった。引き続き勉強します。


駆け足で書きましたので、後日追記するかもしれません。

ここが間違っているよ!・ここはこうした方がいいよ!等あれば教えていただきたいです。

以上です。ありがとうございました。


参考