Linuxでテキストファイルを処理する際、最もよく使われる強力なコマンドの一つが sed です。
「ファイル内にある『0000』をすべて『AAAA』に変えたい。かつ、同じファイル内にある『1111』もすべて『BBBB』にまとめて変えて、結果を別ファイルに保存したい!」
という場面、ありませんか?
1回ずつ置換コマンドを実行して中間ファイルを作るのは格好悪いですし、何より面倒ですよね。 今回は、1行のコマンドでスマートに複数の文字列を同時に置換する方法を解説します!
💡 結論:この1行で一発解決!
ファイル a に含まれるすべての「0000」を「AAAA」に、すべての「1111」を「BBBB」に置換し、結果をファイル b に保存するコマンドはこちらです。
sed -e "s/0000/AAAA/g" -e "s/1111/BBBB/g" a > b
とてもシンプルですね! このコマンドの仕組みがどうなっているのか、分解して詳しく見ていきましょう。
🔍 コマンドの解説
このワンライナー(1行コマンド)は、以下の要素で構成されています。
1. -e オプションで複数の編集指示を連結する
sedコマンドは、通常1つの処理しか行いませんが、-e オプション(expressionの略)をそれぞれの指示の前に付けることで、「これもやって、さらにあれもやって」と複数の処理を連続して実行させることができます。
2. "s/置換前/置換後/g" の意味
置換処理の基本形である s/0000/AAAA/g の中身は次の通りです。
-
s:Substitute(置換)の意味 -
/0000/AAAA/:0000 を AAAA に置き換える -
g:Global(全体)の意味。これがないと、各行で最初に見つかった1箇所しか置換されません。 行内にあるすべての対象文字列を漏れなく変えたいときは、末尾のgが必須です。
3. a > b(入力ファイルとリダイレクト)
-
末尾の
aは、読み込み元(入力)となるファイル名です。 -
>(リダイレクト)を使い、sedが画面に出力しようとした置換結果をキャッチして、ファイルbへ書き出しています。(ファイルbが存在しない場合は新規作成され、存在する場合は上書きされます)
🛠️ 実際の動作イメージ
例えば、元ファイル a の中身が以下のような状態だったとします。
ファイル a の中身:
ターゲットは 0000 です。
ここにも 0000 があります。
そして次の行には 1111 と 1111 が並んでいます。
先ほどのコマンドを実行します。
$ sed -e "s/0000/AAAA/g" -e "s/1111/BBBB/g" a > b
すると、新しく生成されたファイル b の中身は以下のようになり、完璧に2つのパターンが同時に、かつ漏れなく置換されていることが分かります!
ファイル b の中身:
ターゲットは AAAA です。
ここにも AAAA があります。
そして次の行には BBBB と BBBB が並んでいます。
📝 まとめ:3つ以上の置換も同様に可能!
今回のテクニックを使えば、-e "s/.../.../g" を後ろにどんどん繋げていくことで、3つでも4つでも何個でも同時に置換処理を追加していくことが可能です。
# 3つ同時に置換する場合の例
sed -e "s/0000/AAAA/g" -e "s/1111/BBBB/g" -e "s/2222/CCCC/g" a > b
テキスト処理やシェルスクリプトの自動化において非常に重宝する定番テクニックですので、ぜひ覚えて活用してみてくださいね!
