第4回 | sed で一括置換を安全にやる | 同じ修正をまとめて処理する|UNIX Cafe

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第4回 | sed で一括置換を安全にやる | 同じ修正をまとめて処理する|UNIX Cafe

Unixコマンド実践 | 第4回

ファイルの中に同じ表記ゆれや同じ間違いが何回も出てくることがあります。そういうとき、1つずつ直していくのは意外と面倒です。

今回は sed を使って、その繰り返しをまとめる方法を見ていきます。新しいことをたくさん覚えるというより、同じ修正をまとめて流すための道具として考えると分かりやすいです。

ターミナルにまだ慣れていない方は、「テキストを上から順に見ながら、合ったところだけ直す道具」だと思って読むと入りやすいです。この記事では、まず元のファイルを変えずに、画面表示だけで確認しながら進めます。

📝 この記事で学べること

  • s/old/new/ の基本形
  • g を付ける意味
  • /pattern/d で不要行を消す方法
  • -e で処理を並べる考え方
目次

同じ修正を何回も直す代わりにまとめる

たとえばメモや設定ファイルの中に、同じ表記ゆれが何回も出てくることがあります。手で直してもよいのですが、件数が増えると少しずつ面倒になってきます。

そこで sed を使うと、同じ置換や不要行の削除をまとめて流せます。実際に手を動かしながら流れを見ていきましょう。

まず vi で、練習用の notes.txt を作ります。

vi notes.txt

i を押して入力モードに切り替え、次の6行を入力します。

color: grey grey
button: grey grey
border: grey grey
tmp line
footer: grey grey
tmp line

入力できたら Esc を押し、:wq で保存して終了します。

:wq

中身を確認してみましょう。

cat notes.txt

このファイルでは、greyblack にそろえたい行と、不要な tmp line が混ざっています。置換したい行はどれも grey が2回ずつ入っているので、g の有無の違いも見やすくなっています。

まずは置換の基本形を見る

sed の置換は s/old/new/ という形で書きます。s は置換、最初の単語が変えたい文字、次の単語が置き換え後の文字です。

ファイルは変更せず、確認だけする

sed 's/grey/black/' notes.txt

実行すると、画面には置換後の結果が表示されます。

ここで大事なのは、元の notes.txt は変更されていないことです。

なお、この段階では color: grey grey や button: grey grey の行も、最初の grey だけが black に変わります。まずはこの動きを確認してから、次に g を付けた場合を見ていきます。

sed は、何も付けなければ結果を画面に表示します。この形では元の notes.txt は変更されません。最初は画面に表示して確認しながら使うと、流れをつかみやすくなります。

実際にファイルを変更する

ファイル自体を書き換えたいときは -iオプションを使います。macOS では次のように書きます。

sed -i '' 's/grey/black/g' notes.txt

ここで ” は、バックアップファイル名の拡張子を空にする指定です。つまり「元のファイルをそのまま書き換え、バックアップは作らない」という意味になります。

バックアップを作成して、ファイルを変更する

元の内容も残したいなら、まずは次のようにバックアップを付けて書くと分かりやすいです。

sed -i .bak 's/grey/black/g' notes.txt

この場合は notes.txt を書き換えつつ、元の内容が notes.txt.bak に残ります。

変更したファイルを、別名で保存する

元のファイルを残したまま、別の名前で保存したい場合は、たとえば次のように書けます。

sed 's/grey/black/g' notes.txt > new_notes.txt

最初のうちは、いきなり -iで書き換えるより、まずは画面表示で結果を確認してから進める方が安心です。

g を付けると行の中をまとめて置換できる

同じ行の中に対象が何回か出てくることもあります。そのときは g を付けると、行の中をまとめて置換できます。

sed 's/grey/black/g' notes.txt

g がないと、その行の最初の1回だけが置換されます。g を付けると、その行に出てくる対象がすべて置換されます。たとえば button: grey grey は、g なしなら button: black greyg ありなら button: black black になります。

最初の1回だけ置換されて「あれ、全部変わらない」と感じたときは、g を付けるかどうかを見直すと整理しやすいです。

不要な行を削除する

置換だけでなく、不要な行を消す整理にも sed は使えます。

sed '/tmp line/d' notes.txt

この形では、tmp line に一致した行を丸ごと削除します。不要な文字列そのものを削除するのではなく、その行全体を落とす、という点で混乱しやすいので分けて覚えるとよいです。

-e で処理を並べる

表記をそろえて、不要行を消す。そんな流れを1回でまとめたいときは、-e で処理を並べると分かりやすく書けます。

sed -e 's/grey/black/g' -e '/tmp line/d' notes.txt

このコマンドは、まず greyblack に置き換え、そのあとで tmp line の行を削除する、という順番です。

sed は「同じ修正をまとめる」、-e は「処理を並べる」と短く覚えておくと、読み返したときに整理しやすくなります。

初心者がつまずきやすい点

sed で最初に混乱しやすいのは、「画面表示だけなのか」「ファイル自体を書き換えるのか」が分かりにくいことです。今回の記事では、まず表示だけで確認する形に絞っています。削除や変更の処理に進む前に、この確認を入れておくと、順番に進めやすくなります。

もう1つのよくある混乱は、置換対象のスペルや空白が少しでも違うと一致しないことです。grey grey は別物ですし、大文字小文字もそのまま区別されます。「変わらない」と感じたら、対象文字列をまず正確に見直すのが近道です。

結果を保存したいなら、次のようにリダイレクトで出力を別ファイルに残せます。

sed -e 's/grey/black/g' -e '/tmp line/d' notes.txt > cleaned_notes.txt

sed は「テキストを流しながら置換や削除をする」、s/old/new/ は「置換」、/pattern/d は「一致した行を削除」と短く整理しておくと、あとから見返しやすくなります。

手を動かすミニ練習

今度は別のファイルで、同じ流れを自分で試してみましょう。テーマはカフェメニューです。

まず vi で、練習用の menu_notes.txt を作ります。

vi menu_notes.txt

i を押して入力モードに切り替え、次の5行を入力します。

latte: hot hot
cake: hot
tmp line
tea: hot
tmp line

入力できたら Esc を押し、:wq で保存して終了します。

:wq

準備ができたら、次の3つを順番に試してみてください。

  1. sed 's/hot/warm/' menu_notes.txt を実行して、画面表示だけが変わることを確認する
  2. sed '/tmp line/d' menu_notes.txt を実行して、不要な行だけが消えることを確認する
  3. sed -e 's/hot/warm/g' -e '/tmp line/d' menu_notes.txt を実行して、置換と削除をまとめてできることを確認する

この練習では、「最初はファイルを書き換えずに試せる」「行全体を削除する形がある」「複数の処理を並べられる」という3つの要点を、自分の画面で確かめられます。本文と同じ流れで動いていることが確認できたら、練習完了です。

同じ修正をまとめると作業を進めやすくなる

表記ゆれや不要行を1つずつ直すより、まとめて処理できた方が確認作業は進めやすくなります。sed はその入り口として、まずは「置換」と「削除」だけ覚える形で十分役立ちます。

次回予告

次回は、awk を使ってテキストを列として見る方法を見ていきます。CSV やログを、ただの文字列ではなく表として扱う感覚を整理します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

Created by UNIX Cafe

目次