1

我需要将一些 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 可以解释为存在的测试,或回显的参数。

我怎样才能防止这种情况并将其用于 sed 命令?

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

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

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

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

带有未知字符串

4

2 回答 2

3

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

myArgs=("-e" "s/foo/bar/" "-e" "s/foo2/bar2/")
sed "${myArgs[@]}" <<< "foo"
于 2020-05-08T20:44:08.290 回答
1

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

echo foo | eval sed $myArgs

输出:

bar

相关问题:关于要警惕的事情: 为什么要在 Bash 中避免使用 eval,而应该使用什么?

Mo Budlong的 Sunworld 专栏命令行心理学 101是我见过的对理解命令行解析最有帮助的东西。

于 2020-05-08T21:24:08.633 回答