ターミナルから特定のディレクトリにあるファイル内の指定文字列を一斉置換する方法
いや、それ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.txt
のthis
をthat
に変えてみる。
その場合、
$ 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'
今回は全てのファイルに存在するtest
をsample
に変えてみます。
その為には
$ 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'
正規表現使用可能なので、使う場面はこれも多いかも。時間があったら書く予定。
コメント
コメントを投稿