如何将 sed 参数存储在变量中以在 BASH 中进行参数替换

How to store sed arguments in variable for parameter substitution in BASH

我需要将一些 sed 表达式存储在一个变量中并在 sed 命令中替换它。

myArgs="-e 's/foo/bar/' -e 's/foo2/bar2/'"

到目前为止这些都不起作用:

echo "foo" | sed ${myArgs} 
# sed: -e expression #1, char 1: unknown command: `''

echo "foo" | sed  $(echo ${myArgs})
# sed: -e expression #1, char 1: unknown command: `''

echo ${myArgs}
's/foo/bar/' -e 's/foo2/bar2/'
# 1st -e missing

参数扩展解释变量中的第一个 -e 参数。

-e 可能被解释为对存在的测试,或 echo 的参数。

如何防止这种情况发生并在 sed 命令中直接使用它?

澄清一下,这只是一个命令的简化版本,它将包含大量带有需要在正则表达式中转义的字符的 sed 表达式,我宁愿保留表达式的原样,并转储所有将 sed 表达式作为单个变量放入 sed 命令中。

如果那不可能,我将使用不同的方法,例如下面的当前答案,但是似乎应该有一些内置的 bash 方法来不预扩展变量,而只是在最终的 sed 命令中使用它之前,将其解释为字符串。

我使用的实际参数看起来像这样:

-e 's/^>chr1.*/>NC_032089.1_chr1/' -e 's/^>chr2.*/>NC_032090.1_chr2/'

带有未知字符串

不要使用字符串,使用数组:

myArgs=("-e" "s/foo/bar/" "-e" "s/foo2/bar2/")
sed "${myArgs[@]}" <<< "foo"

既然我们知道输入,而且sed代码足够安全,这里使用eval就可以了:

echo foo | eval sed $myArgs

输出:

bar

相关Q.注意事项:Why should eval be avoided in Bash, and what should I use instead?

Mo Budlong 的 Sunworld 专栏 Command line psychology 101 是我看到的对理解命令行解析最有帮助的东西。