从sed替换多个文件时遇到问题

时间:2013-11-14 09:49:19

标签: bash

我想用sed替换bash脚本中的多个文件。

当我从bash中调用它时,我得到以下错误

DEBUG FLOW: -

FILELIST='/tmp/components/ab.sql /tmp/b.sql'
+ SUBSTITUTE_STRING=abc
+ sed -i.bak -e s/abc/xyz/g '/tmp/components/ab.sql /tmp/b.sql': No such file or directory

然而,当我直接在终端上使用此命令时,它成功执行

sed -i.bak -e s/abc/xyz/g /tmp/components/ab.sql /tmp/b.sql

与终端和脚本的区别在于文件周围的引号。

我已经尝试定义没有引号的文件列表变量

请建议

1 个答案:

答案 0 :(得分:1)

而不是说:

FILELIST='/tmp/components/ab.sql /tmp/b.sql'

通过说:

使它成为一个数组
FILELIST=(/tmp/components/ab.sql /tmp/b.sql)

并且在调用时说:

sed -i.bak -e "s/abc/xyz/g" "${FILELIST[@]}"

如果查看调试流程,很明显shell会将文件名解析为单个标记('/tmp/components/ab.sql /tmp/b.sql'),从而导致No such file or directory错误。