调用 sed 替换存储在 bash 变量中的字符串

调用 sed 替换存储在 bash 变量中的字符串

bash我想用sedor扩展变量awk。该变量是一个数组。

例如,脚本必须删除数组中包含的字符串。我试过

ARRAY1=(
string1
string2
string3
)

sed -i '/${ARRAY1[@]}/d'  /etc/file

ARRAY1=(
string1
string2
string3
)

for i  in ${ARRAY1[@]} ;do sed -i '/$i/d'  /etc/file;done

但没有一个有效,sed不会扩大变量。
我怎样才能做到这一点?

答案1

zsh

array1=(
  string1
  string2
  string3
)
sed -i -e/$^array1/d file

将删除与 中任何正则表达式匹配的所有行$array1

或者你可以这样做(任何类似 Bourne 的 shell):

regexps='string1
string2
string3'
grep -ve "$regexps" file

或者,要搜索字符串,请添加-F

grep -F -v -e$^array1 # (zsh)

或者:

strings='string1
string2
string3'
grep -F -ve "$strings" # (any shell)

答案2

找到解决方案,使用""而不是''.

答案3

我不会使用 sed 而是使用 egrep -i -v (-i 不区分大小写 -v 与模式不匹配):

egrep -i -v "$(echo ${ARRAY1[@]} | tr ' ' '|')" /etc/file

表达方式

echo ${ARRAY1[@]} 

因为它没有引号,所以不会打印新行,用数组中的所有字符串创建一个空格分隔的字符串。

tr ' ' '|'

将用 \| 替换所有空格(或)用于 grep 表达式,它将为您的 grep 命令构建模式。

现在,如果您坚持使用 sed,有几个选项,其中之一如下所示:

 sed -i $(echo ${ARRAY1[@]} | sed -e 's:\w\+:-e "/\1/d":g') /etc/file

这将为 sed 基本 sed 命令创建一个单独的 -e "/stringFromArray/d"

注意:确保没有空格或“/$|”在数组中的字符串中。如果有取决于您尝试的解决方案,它可能会妨碍您。

相关内容