Chama o sed para substituir uma string armazenada em uma variável bash

2

Desejo expandir uma variável em bash com sed ou awk . Esta variável é uma matriz.

Por exemplo, o script deve excluir strings contidas na matriz. Eu tentei

ARRAY1=(
string1
string2
string3
)

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

e

ARRAY1=(
string1
string2
string3
)

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

mas nenhum funciona, sed não expande as variáveis.
Como posso fazer isso?

    
por elbarna 02.10.2014 / 12:48

3 respostas

3

com zsh :

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

Excluiria todas as linhas que correspondem a qualquer uma das regex em $array1 .

Ou você poderia fazer (qualquer shell tipo Bourne):

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

Ou, para pesquisar strings, adicione o -F :

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

ou:

strings='string1
string2
string3'
grep -F -ve "$strings" # (any shell)
    
por 02.10.2014 / 14:06
1

Solução encontrada usando "" em vez de '' .

    
por 02.10.2014 / 12:50
-1

Eu não usaria sed ao invés de usar egrep -i -v (-i insensitive case -v não combina com padrão):

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

a expressão

echo ${ARRAY1[@]} 

porque não tem aspas, não imprime uma nova linha, criando uma string delimitada por espaço com todas as strings da matriz.

tr ' ' '|'

substituirá todos os espaços por \ | (ou) para a expressão grep que irá construir o padrão para o seu comando grep.

Agora, se você insistir em usar o sed, há algumas opções que podem ser parecidas com:

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

Isto irá criar um separado -e "/ stringFromArray / d" para o comando sed base sed

NOTA: certifique-se de que não há espaços ou "/ $ |" nas strings em sua matriz. Se houver dependendo de qual solução você tentar, poderá atrapalhar.

    
por 02.10.2014 / 14:27