2016-07-29 42 views
2

我有这样的脚本:击扩大变量包含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 ,所以我猜双引号是为什么它不工作。

如何解决这一问题?

+2

如何解决这一问题?不在变量中存储命令。 [我试图把一个命令放在一个变量中,但复杂的情况总是失败!](http://mywiki.wooledge.org/BashFAQ/050) – fedorqui

+0

@fedorqui这可能是一个明智的建议,但我是建立多个表达式传递给sed,所以它不需要解析一个单一的文件一百万次,所以编程它们是我唯一的选择(我认为)。 – Svalorzen

+0

@Svalorzen:如果您可以使用'eval',请查看我的答案! – Inian

回答

5

我不知道到底为什么你想做的事,你在做什么,但我认为,这可能帮助:

$ 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 
+0

如果我想一次添加一个? '#!/ bin/bash xx =()xx + =(' - e')xx + =('“s | a | b | g”')sed -i“$ {xx [@]}”file' does not似乎工作,但我认为它应该是相当于你的。 – Svalorzen

+2

如果你更具体说明_how_它不起作用,但你应该使用'xx + =('s | a | b | g')'(失去双引号),它会有所帮助。 –

+0

它给出了同样的错误,'sed:-e表达式#1,字符1:未知命令:''''' '。我没有指定它,因为它很容易重现。在其中一种模式中有空格?为什么它有效? – Svalorzen

1

你可以尝试使用扩张的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 
+1

提示'eval'的问题在于它看起来很简单,但非常简单那些并不真正了解其工作原理的人开始尝试将其应用于更复杂的情况,并开始失败(可能是错误的)。对于没有其他解决方案的问题,请保存'eval'。 – chepner