投稿

ラベル(ターミナル)が付いた投稿を表示しています

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

イメージ
いや、それgrepコマンドで良くない??? 単一ファイルの変換 カレントディレクトリのファイル全てを対象にする場合 いや、それ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' 今回は全てのファイルに存在するte