シェルは印刷できない文字にファイル名を変更します。

シェルは印刷できない文字にファイル名を変更します。

私のシェルで印刷できない日本語の文字が元々含まれていたファイル名を一括で変更する方法を見つけたいと思います。正規表現の仕組みを理解する上で、確かに何かが抜けました。このユースケースでは

私が実行すると、ls次のことがあります。

AIR?t?H?[????002.jpg
AIR?t?H?[????009.jpg
AIR?t?H?[????075.jpg

そしてls -ldb *私にこれを与える:

AIR\342t\342H\374[\342\353\342\307002.jpg
AIR\342t\342H\374[\342\353\342\307009.jpg
AIR\342t\342H\374[\342\353\342\307075.jpg

基本的に私は間のすべてを一致させ、交換したいと思います。空気そして[0-9]*

私は現在同様のものを探しています。

find AIR*.jpg -type f -exec sed -ri 's/(?<=AIR)(.*?)([0-9]*)/\2test/' {} +

ただし、次のエラーが発生します。

sed: -e 式 #1、文字 31: 前の正規表現が無効です。

私も試しました。

echo AIR�t�H�\[����002.jpg | sed -r 's/AIR([^[:print:]\t\r])*/\1toto/g'

しかし、名前が変わった。空気「特殊文字」グループの代わりに

トト�t�H�[����002.jpg

そして

echo AIR�t�H�\[����002.jpg | sed -r 's/AIR([^[:print:]\t\r])*/\2toto/g'

返品

sed: -e 式 #1、文字 33: 's' コマンドの RHS への誤った参照\2

それもオプションになりそうですが、tr両方のグループに特殊文字しかないわけではありません。空気そして[0-9]*だからこれが私が得るものです:

echo AIR�t�H�\[����002.jpg | tr -c '[:print:]\t\r\n'test '[ *]'

返品:

エアtH [002.jpg

答え1

sed置換は、最初の引数と一致するインスタンス(を使用した後のすべてのインスタンス)を見つけ、g正確に一致するインスタンスを2番目の引数に置き換えます。したがって、最初のパラメータに「AIR」を含めると置き換えられます。これを維持するには、2番目のパラメータに含める必要があります。間違った参照について文句を言う場合は、sed最初のパラメータでそのグループを定義していないことを意味します(指定したとおり、\(and\)または(andを使用)。)-r

「AIR」の後にランダムな文字と数字が続くので、次のことを提案します。

sed -r 's/AIR([^[:digit:]]*)([[:digit:]]+).jpg/AIRtest\2.jpg/g'

これは、「AIR」を「AIR」に置き換え、数字以外のすべての数字を「test」に置き換え、それ以降のすべての数字を保持します。 「AIR」と数字の間の文字を処理する必要がない場合は無視してもかまいません。

sed -r 's/AIR[^[:digit:]]*([[:digit:]]+).jpg/AIRtest\1.jpg/g'

Perlがある場合は、renameそれを変更してファイル名を変更できます。

rename 's/AIR[^[:digit:]]*([[:digit:]]+).jpg/AIRtest\1.jpg/g' AIR*.jpg

または

rename 's/AIR[^[:digit:]]*([[:digit:]]+).jpg/AIRtest$1.jpg/g' AIR*.jpg

(グループ参照をrename好む$)。

関連情報