Linuxでgrep結果を置換!ヒットした箇所を別の文字列に書き換える方法

目次

スポンサードリンク

Linuxのgrepコマンドでは条件で指定した文字列を含む行だけを抽出したり、正規表現にマッチする行だけを抽出することができます。

開発に携わっていると、grepの結果に対し、該当した箇所すべてを置換したいことがよくあります。ファイルを対象に該当箇所を一つずつ開いて編集するのは面倒です。そんな時に役立つ、一括置換のテクニックを紹介します。

サンプルとして用意したファイルとgrep結果

以下コマンドでは、/var/www/htmlフォルダに移動し、common.jsという文字列を含むファイルを探しています。 下記例では3つのファイルが該当しています。ヒットしているのは、common.jsを読み込むためのscriptタグが書かれたHTMLファイルです。

[root@hostname /]# cd /var/www/html
[root@hostname html]# grep -rn common.js .
./index.html:221:<script src="/assets/js/common.js"></script>
./knowledge/index.html:142:<script src="/assets/js/common.js"></script>
./faq/index.html:232:<script src="/assets/js/common.js"></script>

grep結果を置換するコマンド

今回の例では、common.js にアクセスするとき、キャッシュクリアのため任意のパラメータを付与したいとしましょう。下記コマンドは、common.js部分を置換して、末尾にパラメータt と日付文字列を付与しています。コマンド実行後、再度grepしてみると、該当箇所が置換されています。

[root@hostname html]# grep -l 'common.js' . -r | xargs sed -i 's/common.js/common.js?t=20250516/g'
[root@hostname html]# grep -rn common.js .
./index.html:221:<script src="/assets/js/common.js?t=20250516"></script>
./knowledge/index.html:142:<script src="/assets/js/common.js?t=20250516"></script>
./faq/index.html:232:<script src="/assets/js/common.js?t=20250516"></script>

コマンドの解説

上記コマンドでは、grepコマンドで指定した条件に一致する行を検索する際、-l オプションを付けて条件に一致する行を含むファイルの名前のみを出力しています。そして、grepコマンドの結果をパイプで後続のxargsコマンドに渡しています。

xargsコマンドは、標準入力から受け取った文字列を引数として、後続のコマンドを実行します。

sed コマンドは、ストリームエディタと呼ばれ、ファイルの内容を置換したり、特定の操作を行ったりするために使用します。-i オプションは、ファイルを直接編集(上書き)しますので注意して使用してください。’s/common.js/common.js?t=20250516/g’ で文字列置換の対象パターンと置換後の文字列を指定しています。



Linuxコマンドについて学べるおすすめ書籍
Linuxコマンドの知識は、プログラマにとって長く役立つ知識です。 私はこちらの書籍で一通り知識を抑えました。基本から丁寧に解説されています。

Linux教科書 図解でパッとわかる LPIC/LinuC
はじめてLPICを受ける方向け、手を動かしながらLinuxについて学びたい方におすすめ。30日間の無料体験もできる『Kindle Unlimited』でも読むことができます。