Bash扩展包含正确的sed模式的变量

时间:2016-07-29 09:46:30

标签: bash 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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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