ターミナルから特定のディレクトリにあるファイル内の指定文字列を一斉置換する方法

いや、それgrepコマンドで良くない???

と言われること間違いなしの内容。

ただ僕自身、誰かにこれやってね!!と言われるとパッと思い浮かばなかったので自戒のためにコピペで動くように書いておく。

zshで動作確認をしています。

今のmacOSってプリインストールされてるのzshなの知らなかった・・・

フォルダ構成はこんな感じ。

grep_test

|

|-----grep.txt

|-----grep2.txt


あ、githubにファイルを作ってコミット履歴も残していますので、気になる方はそちらも確認どうぞ。


grep.txtには

this is grep test file.

grep2.txtには
is this grep command test?????

という文字列が書かれており、共通の文字列としてthis,grep,testが存在しています。

単一ファイルの変換

まずは単一のファイルの中身を変えてみます。

grepコマンドで単一の実行しようとすると

$ grep  -l  '置換対象の文字列' 置換対象のファイル | xargs sed  -i.bak -e  's/置換対象の文字列/置換後の文字列/g'

となる。

今回はgrep.txtthisthatに変えてみる。

その場合、

$ grep  -l  'this' grep.txt | xargs sed  -i.bak -e  's/this/that/g'

となり、grep_test内で上記のコマンドを叩くと、

that is grep test file.

と変換される。

カレントディレクトリのファイル全てを対象にする場合

カレントディレクトリ内の全てのファイルを対象にして行う場合はこちら。

$ grep  -l  '置換対象の文字列' ./* | xargs sed  -i.bak -e  's/置換対象の文字列/置換後の文字列/g'

今回は全てのファイルに存在するtestsampleに変えてみます。

その為には

$ grep  -l  'test' ./* | xargs sed  -i.bak -e  's/test/sample/g'

というコマンドを叩く。
すると、

that is grep sample file.
is this grep command sample?????

となる。

おまけ

fooという名前が含まれているファイルが引っかかる。

$ grep  -l  '置換対象の文字列' ./foo* | xargs sed  -i.bak -e  's/置換対象の文字列/置換後の文字列/g'

正規表現使用可能なので、使う場面はこれも多いかも。時間があったら書く予定。

コメント

このブログの人気の投稿

Braveブラウザの同期機能をiPhoneで設定した話。

failed: unable to get local issuer certificate (_ssl.c:1123)と出たので解決した話

自作のChrome Extensionをインポートした時に "Invalid value for 'content_scripts[0].matches[0]': Empty path."というエラーが出たので解決した