Just another IT site ※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。At Your Own Risk!! TURN BACK WHILE YOU CAN
PR

【Linux】sedコマンドで複数パターンの文字列を同時に置換して別ファイルに出力する方法

※IT系の記事は当方環境での実施内容となるため実施する場合は自己責任でお願いいたします。スクリプトはAI生成のものも多いのでコピー&ペーストの際は文字コードに注意ください!

Linuxでテキストファイルを処理する際、最もよく使われる強力なコマンドの一つが sed です。

「ファイル内にある『0000』をすべて『AAAA』に変えたい。かつ、同じファイル内にある『1111』もすべて『BBBB』にまとめて変えて、結果を別ファイルに保存したい!」

という場面、ありませんか?

1回ずつ置換コマンドを実行して中間ファイルを作るのは格好悪いですし、何より面倒ですよね。 今回は、1行のコマンドでスマートに複数の文字列を同時に置換する方法を解説します!

スポンサーリンク
バッチ処理の自動化スキルは市場価値が高いです。今の自分の単価を調べてみませんか?
顧客常駐はもう嫌だ!社内SEへ転職するなら【社内SE転職ナビ】
Cursor・Claude Code・Codex AIスキルを学ぶなら
環境構築不要!AIエージェント開発を非エンジニアでも即実践【AI Agent Camp】

💡 結論:この1行で一発解決!

ファイル a に含まれるすべての「0000」を「AAAA」に、すべての「1111」を「BBBB」に置換し、結果をファイル b に保存するコマンドはこちらです。

Bash

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 の中身:

Plaintext

ターゲットは 0000 です。
ここにも 0000 があります。
そして次の行には 1111 と 1111 が並んでいます。

先ほどのコマンドを実行します。

Bash

$ sed -e "s/0000/AAAA/g" -e "s/1111/BBBB/g" a > b

すると、新しく生成されたファイル b の中身は以下のようになり、完璧に2つのパターンが同時に、かつ漏れなく置換されていることが分かります!

ファイル b の中身:

Plaintext

ターゲットは AAAA です。
ここにも AAAA があります。
そして次の行には BBBB と BBBB が並んでいます。

📝 まとめ:3つ以上の置換も同様に可能!

今回のテクニックを使えば、-e "s/.../.../g" を後ろにどんどん繋げていくことで、3つでも4つでも何個でも同時に置換処理を追加していくことが可能です。

Bash

# 3つ同時に置換する場合の例
sed -e "s/0000/AAAA/g" -e "s/1111/BBBB/g" -e "s/2222/CCCC/g" a > b

テキスト処理やシェルスクリプトの自動化において非常に重宝する定番テクニックですので、ぜひ覚えて活用してみてくださいね!

タイトルとURLをコピーしました