[Mac] 指定ディレクトリ内の複数ファイルをテキスト置換

以前コマンドラインでテキスト置換する方法を書いた。

Mac のターミナルでテキスト置換 – with a Christian Wife
https://wacw.cf/2020/03/11/replacing-text-with-terminal-on-mac/

同じことを、指定ディレクトリ内の複数ファイルに対して実行したい。

環境:macOS Catalina Version 10.15.6(英語環境)

カレントディレクトリの txt ファイルに対して文字列置換をする場合、以下のようなコマンドを実行する。

$ find . -name "*.txt" | xargs grep -rl "[検索文字列]" | xargs gsed -i -e "s/[検索文字列]/[置換文字列]/g"

【説明】
・find . -name "*.txt":カレントディレクトリの txt ファイルを検索
・「コマンド A | xargs コマンド B」:コマンド A の実行結果を引数にしてコマンド B を実行
・grep -rl:-r がサブディレクトリ内も含めて検索、-l が一致するものが含まれるファイルのみ表示
・-i:テキストの挿入。バックアップファイルも出力したいなら -i.bak とすると 〜.txt.bak というバックアップファイルも同時に出力される。
・-e スクリプト:スクリプト(コマンド)を追加する。

また今回私は、置換文字列にダブルクオーテーションマークを含んでいた。こういう場合は grep や gsed で使う引用符をシングルクォーテーションマークにし、検索文字列や置換文字列に含まれるダブルクオーテーションマークをバックスレッシュでエスケープすればいい。つまり以下のようになる。

$ find . -name "*.txt" | xargs grep -rl '[検索文字列( \ でエスケープ)]' | xargs gsed -i -e 's/[検索文字列( \ でエスケープ)]/[置換文字列( \ でエスケープ)]/g'

参考:
MacのTerminalでファイル内テキスト検索&テキスト置換 – ケルベロスさんのプログラミング / けるぷろ
http://popeyekn.hatenablog.com/entry/2019/04/11/170855

Macであるディレクトリ以下のファイル内の特定文字列を一括置換する方法 – Qiita
https://qiita.com/zakihaya/items/d000bbeefbeaf47c0de3

【 xargs 】コマンド――コマンドラインを作成して実行する:Linux基本コマンドTips(176) – @IT
https://www.atmarkit.co.jp/ait/articles/1801/19/news014.html

【 grep 】コマンド――特定の文字を含む行を抽出する:Linux基本コマンドTips(9) – @IT
https://www.atmarkit.co.jp/ait/articles/1604/07/news018.html

sedコマンドで行単位に処理するオプションの挙動メモ – aoma blog
https://aoma23.hatenablog.jp/entry/sed_memo

sed でシングルクォートをエスケープする|茶トラ猫のエンジニア日記
https://itneko.com/sed-escape/