我正在从文本文件中读取一些配置并将它们存储到一个变量中。它们像这样用管道分隔:
a,b|c,d|e,f|g,h
我想将这些传递到sed命令中,以替换文本文件中的左值和右值,并将其输出到另一个文件。
我:
#!/bin/bash
test="a,b|c,d|e,f|j,l"
arr=(`echo $test | sed 's/|/n/g'`)
sub=""
for i in "${arr[@]}"
do
echo "$i"
array=(`echo $i | sed 's/,/n/g'`)
sub+="s/${array[0]}/${array[1]}/g; "
done
sed $sub ${FILE} > output.json
当我这样做时,它为arr中的每个元素运行一个sed命令。所以在第一个sed之后,它说:
No such file or directory
现在,如果我不把$sub作为变量传入,而只是把整个字符串放进去,它会在一个sed命令中完成,它会工作:
sed "s/a/b/g; s/c/d/g; s/e/f/g; s/g/h/g;" ${FILE} > output.json
我如何像第一个例子一样将匹配器作为变量传入,但像第二个例子一样让它在一个sed命令中完成所有工作?
我如何像第一个示例那样将匹配器作为变量传递,但让它像第二个示例那样在一个sed命令中完成所有工作?
Shellcheck会提示你:
Line 12:
sed $sub ${FILE} > output.json
^-- SC2086: Double quote to prevent globbing and word splitting.
^-- SC2086: Double quote to prevent globbing and word splitting.
Did you mean: (apply this, apply all SC2086)
sed "$sub" "${FILE}" > output.json
因为;
后面有一个空格,所以模式是分词的。引用它来防止扩张。当不引用$sub
时,s/c/d/g;
被解析为文件名,因此sed
退出,没有这样的文件或目录。