bash
我想用sed
or扩展变量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"
注意:确保没有空格或“/$|”在数组中的字符串中。如果有取决于您尝试的解决方案,它可能会妨碍您。