Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2819

複数ファイルから特定キーワードを検索して一括置換するワンライナー

$
0
0

カレントディレクトリ内のファイル内の%キーワード%を%置換後文字列%に置換するイメージです。

for file in$(find -maxdepth 1 -type f | xargs grep-F'%キーワード%' | awk'{sub(":","",$1);print $1}');do sed-i's %キーワード% %置換後文字列% g'$file;done

サンプルファイル

$ cat aaa.txt
   hoge
$ cat bbb.txt 

  hogehogehogheoghogefuga

カレントディレクトリ内のファイルを列挙します

find -maxdepth 1 -type f

各ファイル内の%キーワード%を検索します

| xargs grep-F'%キーワード%'

ここまでで以下のような出力が得られます。

$ find -maxdepth 1 -type f | xargs grep-F'hoge'
./bbb.txt:  hogehogehogheoghogefuga
./aaa.txt:   hoge

左端のファイル名だけ得られるように、
以下をつなげます。(:が邪魔なので、awkでsubを使って除去します)

| awk'{sub(":","",$1);print $1}'

こんな感じになります

$ find -maxdepth 1 -type f | xargs grep-F'hoge'| awk'{sub(":","",$1);print $1}'
./bbb.txt
./aaa.txt

この結果をforにかけて、sedで置換します

$ for file in$(find -maxdepth 1 -type f | xargs grep-F'hoge'| awk'{sub(":","",$1);print $1}');do sed-i's hoge moge g'$file;done

以下のように置換されました

$ cat aaa.txt
   moge
$ cat bbb.txt 

  mogemogehogheogmogefuga

もう少し簡潔に書き方も考えたいと思います。

あと、テキストが左端から開始しているとうまくいかないので別途考えたいと思います。


Viewing all articles
Browse latest Browse all 2819