1

我想使用 perl 单线计算使用正则表达式替换的结果文件名。当进行试运行并简单地打印结果时,它会给我想要的结果(那里还没有引号):

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 的输出被重新解释并且空格导致问题。当我在它周围加上双引号时,perl 代码首先由 bash 评估,这会产生另一个问题:

for i in *_\ *; do mv "${i}" "$(perl -ne 'print s/(?<![_ ])_ /-/gr' <<< "${i}")"; done

-bash: ![_: event not found

有什么方法可以仅引用命令替换的输出(而不是命令本身)?

4

1 回答 1

1

如果你希望你的命令替换被 bash 当作一个单词,你应该用双引号将它括起来。为了防止!被 shell 解释,您应该使用以下两种方法之一禁用历史替换:

set +o histexpand

或者

set +H
于 2015-03-01T15:46:46.573 回答