すべてのファイルで「Aux Power [A]」を「aux_power」に変更したいと思います。 「Aux Power [A]」のファイルのみ変更でき、残りのファイルは変更されません。
頑張りました
grep -lR "Aux Power [A]" /mnt/d/power/jan/output | xargs sed -i "s/'Aux Power [A]'/'aux_power_w'/g"
しかし、うまくいかないようです。
アドバイスしてください。
答え1
コードの問題は2つあります。
デフォルトでは、この
grep
コマンドは文字列ではなく正規表現パターンを想定し、文字列には正規表現関連文字([
および]
)が含まれています。交換時に同じ問題が発生しますsed
。出力ファイル名
grep -l
可能損傷する可能性があります。ファイルに印刷できない文字(改行文字など)が含まれている場合は、grep
出力名からその文字を削除してください。これはsed
、ファイルへの呼び出しが行われないことを意味します。
これは、ファイル名ではなくファイルの内容の文字列を変更しようとしていると仮定します。
/mnt/d/power/jan/output
Aux Power [A]
使用できる正確な文字列を含むディレクトリの下のすべてのファイルを見つけるには
find /mnt/d/power/jan/output -type f \
-exec grep -Fq 'Aux Power [A]' {} ';' -print
文字列を変更するには、aux_power
次のようにコマンドを展開します。
find /mnt/d/power/jan/output -type f \
-exec grep -Fq 'Aux Power [A]' {} ';' \
-exec sed -i 's/Aux Power \[A\]/aux_power/g' {} ';'
これはGNUを想定していますsed
。
出力は生成されませんが、grep -Fq
指定された文字列(使用されるため正規表現ではない)を含むすべてのファイルに対してゼロ終了ステータスが返されます-F
。
このsed
コマンドは内部編集(GNUモード)を実行して文字列内のすべての項目を変更します(ここでは正規表現で指定されるため、角かっこがエスケープされます)。
端末にリストされている変更されたファイルの名前を取得するに-print
は、次の手順を実行しますfind
。-exec grep ... {} ';'
sed
ここで使用する式は、変更したい特定の文字列を含まないファイルの内容を変更しないため、コマンドを次のように短縮できます。
find /mnt/d/power/jan/output -type f \
-exec sed -i 's/Aux Power \[A\]/aux_power/g' {} ';'
これは以下を置き換えます。みんなディレクトリ内のファイル/mnt/d/power/jan/output
。この文字列を含まないすべてのファイルは変更されていません(ただし、タイムスタンプは更新され続けます)。
答え2
grepの角かっこを避けるべきです。 「[A]」は「A」と同じです。努力する
grep -lR "Aux Power \[A\]" /mnt/d/power/jan/output | xargs sed -i "s/Aux Power \[A\]/aux_power_w/g"