(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Bash】sedで否定[^X]を利用する場合は検索条件で絞る

スポンサーリンク

はじめに

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

終わりに

置き換える部分で一致をかけているので検索条件って必要なのか?と思っていましたが、否定を用いた検索条件で置換する場合は検索条件の構文が肝ということを再認識しました。

備忘録として残しておきます。