将多个表达式作为变量传递给sed命令,然后输出到新文件



我正在从文本文件中读取一些配置并将它们存储到一个变量中。它们像这样用管道分隔:

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退出,没有这样的文件或目录。

相关内容

最新更新