Shell-Script

shell 用不可列印的字元重命名文件名

  • March 22, 2017

我正在嘗試找到一種方法來批量重命名最初包含日語字元的文件名,這些字元在我的 shell 中是不可列印的。在這個案例中,在理解正則表達式的工作原理時,我顯然缺少一些東西,

當我跑步時,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

基本上我想匹配和替換AIR和**$$ 0-9 $$***

我目前正在看類似的東西:

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

但我得到這個錯誤:

sed: -e expression #1, char 31: 前面的正則表達式無效

我也嘗試過使用

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

但它重命名AIR而不是“特殊字元”組

toto�t�H�[����002.jpg

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

返回

sed: -e 表達式 #1, char 33: ’s’ 命令的 RHS 上的無效引用 \2

似乎也tr可以選擇,但我的兩組AIR和**$$ 0-9 $$***所以這是我得到的:

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

返回:

空氣 t H [ 002.jpg

sed替換查找與第一個參數匹配的實例(自您使用以來的所有實例g),並用第二個參數替換完全匹配。所以如果你在第一個參數中包含“AIR”,它將被替換——如果你想保留它,你需要在第二個參數中包含它。當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更喜歡$組參考)。

引用自:https://unix.stackexchange.com/questions/353000