スキップしてメイン コンテンツに移動

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

いや、それ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で設定した話。

Braveブラウザを使い始めて結構経った 設定 1 .同期ページを開く 2.QRコードの表示 3.iPhoneで読み取る Braveブラウザを使い始めて結構経った Google Domainsで独自ドメインを持っているBloggerをBrave Creatorsに登録した話。 この記事を書いた頃から僕はBraveしか使わなくなっちゃいましたね〜。 広告がないとネットサーフィンが捗りますし、Braveの直接クリエイターに貢献できるような仕組みが特に気に入っています。Blogger,ひいてはGoogle的にどうなんだって話もありそうですけど、ただのユーザなのでそんなのは気にせず便利なものは使います。 それで本題です。 タイトルのように今回同期機能を設定しました。 余計なことをしていたせいで少しハマったので設定ついでに誰かが困ったときに役に立つように設定方法を残しておこうかと思います。 ちなみにこちらの記事はPCの同期にiPhoneを追加するという設定方法についての解説です。iPhone→PCの同期方法などはまた別の話のようです。 設定 1 .同期ページを開く ブラウザのタブの右上にある上矢印のマークをクリックすると以下のような項目が表示されます。 こちらの同期という欄をクリックします。 すると以下のページが表示されます。 自動的に設定ページの中の同期欄が表示されるわけですね。 2.QRコードの表示 同期欄に同期済みのデバイスを管理という欄があるのでそちらをクリックします。 すると以下のようなページが表示されるのでそちらの中の新たなデバイスを追加、スマホ/タブレットという順にクリックしていくとQRコードが表示されます。 これでこのステップは完了です。 3.iPhoneで読み取る このQRコードをiPhoneで読み取っていく訳ですが、このQRコードはプリインストールされているQRコードで読み取っても正しく処理してくれません。 書いてある通り、iPhoneのBraveブラウザで読み取って上げる必要があります。 なのでひとまずiPhoneでBraveブラウザを開き、画面右下の**•••**という所をタップしてください。 すると上から二番目に歯車アイコンの設定が表示されますのでそちらをタップします。 初期表示で画面中部に表示さ

JavaのindexOf関数はナイーブ法で実装されているらしい

indexOf関数とは 実際のソースを見よう ナイーブ法ってなんぞや indexOf関数とは ドキュメント はここ。 indexOf の細かい使い方は説明はしないが、簡単にいうと二つの文字列を比較して重複する箇所がある場合にその開始部分のインデックスを返すというもの。 実際のソースを見よう どのように実装されているのかが気になったので jdkの中に存在するsrc.zipを解凍して確認してみることに。 public int indexOf ( String str ) { return indexOf ( str , 0 ) ; } public int indexOf ( String str , int fromIndex ) { return indexOf ( value , 0 , value . length , str . value , 0 , str . value . length , fromIndex ) ; } static int indexOf ( char [ ] source , int sourceOffset , int sourceCount , char [ ] target , int targetOffset , int targetCount , int fromIndex ) { if ( fromIndex >= sourceCount ) { return ( targetCount == 0 ? sourceCount : - 1 ) ; } if ( fromIndex < 0 ) { fromIndex = 0 ; } if ( targetCount == 0 ) { return fromIndex ; } char

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

Webスクレイピングとか 試していたらこれが突然出た。 macOS用公式インストーラーのPython 3.6でCERTIFICATE_VERIFY_FAILEDとなる問題 という記事に解決策が書いてあったが、 python.orgで配布されているmacOS用の公式インストーラーでインストールしたPython 3.6を使い、 urllib.request.urlopen() で https:// のWebページを取得しようとすると、以下のエラーが発生します。 で、このタイトルのエラーに当たっていたよう。 私の場合はPython3.8.5を使っていたので $ /Applications/Python\ 3.8/Install\ Certificates.command というコマンドをターミナルで叩くことで事なきをえた。 読んでないのが悪いとはいえこれはハマる人が多いんじゃなかろうか。