管道/消耗STDOUT作为单个字符串而不是空格分隔的单词序列

时间:2015-03-01 14:35:32

标签: bash file-rename batch-rename quoting command-substitution

我想使用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

任何方式只引用命令替换的输出(而不是命令本身)?

1 个答案:

答案 0 :(得分:1)

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

set +o histexpand

set +H