我正在尝试找到一种方法来批量重命名最初包含日语字符的文件名,这些字符在我的 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
更喜欢$
团体参考)。