【Linux】sedで文字列を一括置換する方法

【Linux】sedで文字列を一括置換する方法

記事の文字数:1130

Linuxのsedとfindを使い、複数ファイルの文字列を一括置換する方法を詳しく解説します。grepでの事前確認や、特定のディレクトリ・拡張子を除外する方法も紹介するので、大量のファイルを効率的に編集したい方におすすめです。


スポンサーリンク

Linux環境でディレクトリ配下の複数ファイル内の文字列を一括置換するには、findコマンドとsedコマンドを組み合わせる方法が有効です。この記事では、keywordを置換前の文字列、after_keywordを置換後の文字列として、具体的な方法を解説します。

sedコマンドとは

sed(Stream EDitor)は、テキストデータを行単位で処理し、文字列の置換や抽出を行うコマンドです。正規表現にも対応しており、シンプルながら多彩な機能を持ちます。

以下のコマンドを実行すると、最初に出現するkeywordafter_keywordに置換して出力します。

Terminal window
$ echo 'keyword keyword' | sed 's/keyword/after_keyword/'
after_keyword keyword

すべてのkeywordafter_keywordに置換するには、最後にgオプションを指定します。

Terminal window
$ echo 'keyword keyword' | sed 's/keyword/after_keyword/g'
after_keyword after_keyword

特定の行のみを置換するには、行番号を指定できます。

Terminal window
$ echo -e 'line1\nkeyword line2\nkeyword line3' | sed '2s/keyword/after_keyword/'
line1
after_keyword line2
keyword line3

置換前の文字列をgrepで確認

一括置換を行う前に、対象の文字列がどこに存在するかを確認するには、grepコマンドを使用します。

Terminal window
grep -r "keyword" ./

特定のディレクトリを除外する場合は、--exclude-dirオプションを使用します。

実行コマンド(1ディレクトリの場合)
grep -r "keyword" ./ --exclude-dir=src
実行コマンド(複数ディレクトリの場合 {}で囲う)
grep -r "keyword" ./ --exclude-dir={.git,node_modules}

特定の拡張子のファイル内で検索する場合は、--includeオプションを使用します。

実行コマンド
grep -r --include=\*.txt "keyword" ./

sedコマンドで複数ファイルを一括置換

カレントディレクトリ配下のkeywordafter_keywordに一括置換するには、以下のコマンドを実行します。

実行コマンド
find ./ -type f -print | xargs sed -i "s/keyword/after_keyword/g"

注意: sed -i オプションを使用すると、ファイルが直接上書きされるため、実行前にバックアップを取ることを推奨します。

特定のディレクトリを除外して一括置換

特定のディレクトリ(例: node_modules.git)を除外する場合は、grep -vを組み合わせて使用します。

実行コマンド
find ./ -type f -print | grep -v -e node_modules -e .git | xargs sed -i "s/keyword/after_keyword/g"

特定の拡張子のファイルのみを対象に置換する場合は、find-nameオプションを活用できます。

実行コマンド
find ./ -type f -name "*.txt" -print | xargs sed -i "s/keyword/after_keyword/g"

置換後の文字列をgrepで確認

最後に置換が正しく行われたかgrepコマンドで確認します。

実行コマンド
grep -r "after_keyword" ./

まとめ

  • sedコマンドを使用すると、文字列を効率的に置換できる。
  • grepコマンドで置換対象の文字列を事前に確認可能。
  • findコマンドと組み合わせることで、ディレクトリ配下の複数ファイルを一括置換できる。
  • grep -vで特定のディレクトリを除外可能。
  • find -nameを活用して特定の拡張子のファイルのみを対象に置換できる。

この方法を活用することで、大量のファイルを効率的に編集できます。


以上で本記事の解説を終わります。
よいITライフを!
スポンサーリンク
Scroll to Top