Shell-Script
shell 用不可列印的字元重命名文件名
我正在嘗試找到一種方法來批量重命名最初包含日語字元的文件名,這些字元在我的 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
更喜歡$
組參考)。