shell用不可打印字符重命名文件名

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

基本上我想匹配并替换之间的所有内容空气[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'

但它重命名了空气而不是“特殊字符”组

toto�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 '[ *]'

返回:

空气 t H [ 002.jpg

答案1

sed替换会查找与g第一个参数匹配的实例(由于您使用了 ,因此查找所有实例),并用第二个参数替换完全匹配的实例。因此,如果您在第一个参数中包含“AIR”,它将被替换 — 如果要保留它,则需要将其包含在第二个参数中。当sed抱怨无效引用时,这意味着您没有在第一个参数中定义相应的组(使用\(\),或(和 ,)因为您已指定-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更喜欢$团体参考)。

相关内容