Linuxコマンドラインの魔法:sedコマンドでファイル内の文字列を一括検索・置換する方法
Linuxのコマンドラインで作業していると、大きなファイルや複数のファイルの中にある特定のテキストを、別の文字列にまとめて置き換えたい場面によく出会います。該当箇所をひとつずつ手作業で探して書き換えていては、非常に時間がかかってしまいます。しかし心配はいりません。Linuxにはこの問題を一発で解決できる強力な仕組みが用意されています。本記事では、1つまたは複数のファイル内の文字列を自動的に検索・置換する方法を解説します。
sedコマンドとは
今回使用するのは、「sed」というLinuxのコマンドラインツールです。sedは非常に強力かつ多用途なストリームエディタであり、その全機能を紹介すると膨大な分量になってしまいます。本記事で扱うのは、そのごく一部の機能にすぎません。もし興味を持たれたら、ぜひsedについてさらに深く学んでみてください。きっと日々の作業効率が大きく向上するはずです。
基本的な構文
ファイル内の文字列を検索して置換するには、次の構文を使用します。
# sed -i 's/[元のテキスト]/[新しいテキスト]/' ファイル名.txt
実践例:IPアドレスの一括変更
例えば、「database.txt」というファイルに、データベースサーバーのIPアドレスが何度も記載されているとしましょう。サーバーを新しく移行したため、古いIPアドレスを新しいサーバーのアドレスに更新する必要があります。旧IPアドレスが「192.168.1.16」、新IPアドレスが「192.168.1.22」の場合、以下のように操作します。
# cat database.txt
LOCAL_DATABASE = 192.168.1.16
LOCAL_DIR = /home/calvin/
PROD_DB = 192.168.1.16
# sed -i 's/192.168.1.16/192.168.1.22/g' database.txt
# cat database.txt
LOCAL_DATABASE = 192.168.1.22
LOCAL_DIR = /home/calvin/
PROD_DB = 192.168.1.22
ファイルを開いて確認すると、古いIPアドレスがすべて新しいアドレスに置き換わっていることが分かります。
コマンドの構成要素を分解して解説
まず「sed」コマンドを呼び出し、続けて「-i」オプションを渡しています。「-i」は「in place(その場で)」を意味し、ファイルを直接編集することを指示します。次に登場するのが、一般に「正規表現(regex)」と呼ばれる仕組みです。引用符で囲まれた文字列の先頭にある「s」は「substitute(置換)」を、末尾の「g」は「global(グローバル=全体)」を意味します。この2つを組み合わせることで、間に指定した文字列の「全体置換」が実現されます。
「g」を省略した場合の挙動
末尾の「g」は省略することも可能です。省略すると置換はグローバルではなくなり、実際には「各行で最初に一致した箇所だけ」が置換されます。同じ行に置換したいテキストが複数ある場合は、以下のような結果になります。
# cat database.txt
LOCAL_DATABASE = 192.168.1.16
LOCAL_DIR = /home/calvin/
PROD_DB = 192.168.1.16, 192.168.1.16
# sed -i 's/192.168.1.16/192.168.1.22/' database.txt
# cat database.txt
LOCAL_DATABASE = 192.168.1.22
LOCAL_DIR = /home/calvin/
PROD_DB = 192.168.1.22, 192.168.1.16
応用編:ディレクトリ内の全ファイルを一括置換
ここからが本当の魔法です。単一のファイルだけでなく、現在いるディレクトリ全体を対象に置換を行いたい場合もあるでしょう。例えば、複数のテキストファイルに含まれる「wine」をすべて「champagne」に置き換えたいとします。そんなときは、findコマンドとsedを組み合わせます。
# find . -maxdepth 1 -name "*.txt" -type f -exec sed -i 's/wine/champagne/' {} \;
findコマンドの各オプションの意味
「find . -maxdepth 1 -name "*.txt" -type f」の部分で、カレントディレクトリ内のテキストファイルのリストを取得しています。各オプションの意味は以下の通りです。
・find . : カレントディレクトリを検索対象にします。
・-maxdepth 1 : カレントディレクトリより深い階層(サブディレクトリ)には降りません。
・-name "*.txt" : 拡張子が「.txt」のファイルだけをリストアップします。
・-type f : 通常ファイルのみを対象とします。
・-exec : 続くコマンドを実行します。ここでは、テキストを置換するsedコマンド「sed -i 's/wine/champagne/' {} \;」が該当します。
まとめ
sedコマンドを使えば、面倒なテキスト置換作業を数秒で完了できます。単一ファイルなら「sed -i 's/旧/新/g' ファイル名」、ディレクトリ全体ならfindコマンドとの組み合わせが鍵です。これでファイル内の検索・置換は自由自在になりました。ぜひ他のLinux活用テクニックもチェックしてみてください。
-
ChromeとFirefoxでページ内のテキストを検索・置換する方法
ブラウザは、その名のとおりWebページを閲覧するためのツールであり、本来はテキストエディタではありません。そのため、「検索して置き換える(検索・置換)」のようなテキスト編集機能は、標準ではほとんど搭載されていません。しかし、ブログ記事を執筆しているとき、コメントを入力しているとき、メールを作成しているとき、あるいはフォーラムを管理しているときなど、同じ語句が何度も登場するため一括で置き換えたい場面があるかもしれません。そんなときに役立つのが「検索・置換」機能です。この記事では、Google ChromeとFirefoxに検索・置換機能を追加する方法を詳しく解説します。Google Chrome
-
Notepad++で文字列・文字・記号を検索して改行に置き換える方法
Notepad++(ノートパッドプラスプラス)は、プログラマーが快適な環境でソースコードを編集するために広く利用されている無料のテキストエディタです。Windows標準のメモ帳の高機能版にあたり、多数のプログラミング言語に対応しているほか、ソースコードやテキスト編集に役立つ豊富な機能とツールを備えています。テキストファイルの編集中に、特定の場所へ新しい行(改行)を挿入したくなることもあるでしょう。ただし、改行への置き換えを行うには、事前にいくつかのオプションを適切に設定しておく必要があります。この記事では、Notepad++の「検索と置換」機能を使って改行を挿入する方法を詳しく解説します。文字