我有这样的脚本:击扩大变量包含sed的模式正确
#!/bin/bash
xx="-e \"s|a|b|g\""
sed -i $xx file
但SED打破了消息:
sed: -e expression #1, char 1: unknown command: `"'
使用set -x
我可以看到,命令正在扩大,以sed -i -e '"s|a|b|g"' file
,所以我猜双引号是为什么它不工作。
如何解决这一问题?
我有这样的脚本:击扩大变量包含sed的模式正确
#!/bin/bash
xx="-e \"s|a|b|g\""
sed -i $xx file
但SED打破了消息:
sed: -e expression #1, char 1: unknown command: `"'
使用set -x
我可以看到,命令正在扩大,以sed -i -e '"s|a|b|g"' file
,所以我猜双引号是为什么它不工作。
如何解决这一问题?
我不知道到底为什么你想做的事,你在做什么,但我认为,这可能帮助:
$ cat file
a a
$ xx=(-e 's|a|b|g' -e 's|b|c|g')
$ sed "${xx[@]}" file
c c
使用数组存储每个参数的sed。使用"${xx[@]}"
安全地扩展数组,将每个元素作为单个参数传递。
你可以建立数组是这样的:
$ xx=()
$ xx+=(-e 's|a| b c |g')
$ xx+=(-e 's|c| d |g')
$ sed "${xx[@]}" file
b d b d
你可以尝试使用扩张的eval
字符串,但它是不是经常被bash
爱好者推荐。
#!/bin/bash
xx="-e 's|b|a|g'"
eval sed -i "$xx" file
你可以看到它使用eval
时得到扩展,下面是从set +x
++ xx='-e '\''s|a|b|g'\'''
++ eval sed -i '-e '\''s|a|b|g'\''' file
+++ sed -i -e 's|a|b|g' file
片断要看到它在行动: -
$ cat file
line1/script
alaalaala++
line1/script
line2/script
line3/script
alaalaala--
line1/script
$ ./script.sh ; cat file
line1/script
blbblbblb++
line1/script
line2/script
line3/script
blbblbblb--
line1/script
提示'eval'的问题在于它看起来很简单,但非常简单那些并不真正了解其工作原理的人开始尝试将其应用于更复杂的情况,并开始失败(可能是错误的)。对于没有其他解决方案的问题,请保存'eval'。 – chepner
如何解决这一问题?不在变量中存储命令。 [我试图把一个命令放在一个变量中,但复杂的情况总是失败!](http://mywiki.wooledge.org/BashFAQ/050) – fedorqui
@fedorqui这可能是一个明智的建议,但我是建立多个表达式传递给sed,所以它不需要解析一个单一的文件一百万次,所以编程它们是我唯一的选择(我认为)。 – Svalorzen
@Svalorzen:如果您可以使用'eval',请查看我的答案! – Inian