我想使用perl one-liner计算生成的文件名使用regexp替换。在进行干运行并简单打印结果时,它会给出我想要的结果(还没有引号):
for i in *_\ *; do echo "${i}" $(perl -ne 'print s/(?<![_ ])_ /-/gr' <<< "${i}"); done
但当更改为mv
时,它会中断:
for i in *_\ *; do mv "${i}" $(perl -ne 'print s/(?<![_ ])_ /-/gr' <<< "${i}"); done
mv: target ‘9781430249146.pdf’ is not a directory
显然perl的输出被重新解释,而空格会导致问题。 当我在它周围加上双引号时,首先通过bash评估perl代码,这会产生另一个问题:
for i in *_\ *; do mv "${i}" "$(perl -ne 'print s/(?<![_ ])_ /-/gr' <<< "${i}")"; done
-bash: ![_: event not found
任何方式只引用命令替换的输出(而不是命令本身)?
答案 0 :(得分:1)
如果希望命令替换被bash视为单个单词,则应将其用双引号括起来。为了防止shell解释!
,您应该使用以下两种方法之一禁用历史记录替换:
set +o histexpand
或
set +H