ディレクトリ全体の文字列を空白に置き換えます。

ディレクトリ全体の文字列を空白に置き換えます。

すべてのファイルで「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つあります。

  1. デフォルトでは、このgrepコマンドは文字列ではなく正規表現パターンを想定し、文字列には正規表現関連文字([および])が含まれています。交換時に同じ問題が発生しますsed

  2. 出力ファイル名grep -l 可能損傷する可能性があります。ファイルに印刷できない文字(改行文字など)が含まれている場合は、grep出力名からその文字を削除してください。これはsed、ファイルへの呼び出しが行われないことを意味します。


これは、ファイル名ではなくファイルの内容の文字列を変更しようとしていると仮定します。

/mnt/d/power/jan/outputAux 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。この文字列を含まないすべてのファイルは変更されていません(ただし、タイムスタンプは更新され続けます)。

おすすめ記事