内容
状態:-
閲覧数:550
投稿日:2018-03-27
更新日:2018-03-27
ファイル拡張子などで条件を絞って全置換するためには?
「grep」ではなく「find」を使用
複数あるファイルの中から特定の文字列を一括置換したいときのLinuxコマンド
・このコマンドは実行したら修正できないので要注意
find ./ -type f | xargs sed -i "s/hoge/fuga/g"
【上記コマンドの説明】
find
find の次で指定したディレクトリ以下のファイルを検索する。
ファイル検索の構文は「find [path] [検索条件] [アクション]」
./
今いるディレクトリ以下が検索対象。「~/」とするとホームディレクトリ以下が検索対象となる。
./ の代わりにフルパスでも可。この場合も指定したディレクトリ以下が検索対象になる。
-type f
指定したファイルタイプを検索する。fが通常ファイルを,cまたはdとするとディレクトリを,lとするとシンボリック・リンクを検索します。
xargs
標準入力からコマンドラインを作成し、それを実行する
sed
文字列の置換,行の削除を行う
sed の基本構文は「sed (オプション) [対象ファイル]」
-i
文字列を挿入する
s/置換条件/置換文字/g
置換条件はこれから置き換えたい、元の文字列。置換文字は置換後の文字列。
最後に g をつけた場合は。置換条件に一致した全ての文字列を置換文字に置き換える。
このコマンドが修正できない理由
・一度このコマンドを実行後、元の文字列または別の文字列に変更したい場合、他の関係のない文字列に干渉してしまう場合があるため
例えば、
「★★☆☆……」を
$ find ./ -type f | xargs sed -i "s/★/☆/g"
で「☆☆☆☆……」に置換。
でもやっぱり元に戻したいので上記の逆をして
$ find ./ -type f | xargs sed -i "s/☆/★/g"
としても、
「★★★★……」
こうにしかならない
つまり、置換先の文字列内容が、予め対象ディレクトリ内にあると元へ戻せなくなる