はじめに
sedコマンドでは特定の文字列を含む行に対してのみ置換することができます。
sed '/検索文字列/s/置換前文字列/置換後文字列/g'
イマイチ検索文字列のポイントが分かっていなかったのですが「sed」で置換前の部分を変数のようにして扱いたい時に便利なことに気づいたので知見を共有しておきます。
環境情報
$ sed --version sed (GNU sed) 4.4
検索文字列が不要な例
例えば以下のようなテキストファイルがあった場合に
$ cat test.txt Hello World Test
Wolrdの「l」を「1」に変更したいとすれば
以下のように検索条件を利用してもいいですし
$ cat test.txt | sed -e '/World/s/l/1/g' Hello Wor1d Test
使わなくても可能です。
$ cat test.txt | sed -e 's/World/Wor1d/g' Hello Wor1d Test
検索条件が必要な例
以下のようなファイルがあったとします。
$ cat test.txt Apple,https://apple Google,Facebook,https://facebook Microsoft,https://microsoft
企業名,URLという構造にも関わらずURLが空であれば改行されずに出力されてしまうデータを以下のようにしたいとします。
$ cat test.txt Apple,https://apple Google, Facebook,https://facebook Microsoft,https://microsoft
その際に例えばカンマの後にhttps以外が来ている場合は改行を入れようしても置換前の部分は[^https]に反応しますが置換後の部分はその情報が消えてしまいます。
$ cat test.txt | sed -e 's/,[^https]/\n,[^https]/g' Apple,https://apple Google, [^https]acebook,https://facebook Microsoft,https://microsoft
よってこの場合は検索条件で否定を利用すること実施したい処理が実現します。
$ cat test.txt | sed -e '/,[^https]/s/,/,\n/' Apple,https://apple Google, Facebook,https://facebook Microsoft,https://microsoft
終わりに
置き換える部分で一致をかけているので検索条件って必要なのか?と思っていましたが、否定を用いた検索条件で置換する場合は検索条件の構文が肝ということを再認識しました。
備忘録として残しておきます。