Atribuindo saída do grep para uma variável

1

Estou tentando atribuir a saída de um comando grep a uma variável em um script bash e a variável aparece vazia. Quando eu corro o seguinte:

el_value=$(grep '<$2>.*<$2>' $1 | sed -e 's/^.*<$2/<$2/' | cut -f2 -d'>'| cut -f1 -d':')
echo "DEBUG: The value of el_value is '$el_value'"

A saída é:

DEBUG: The value of el_value is ''

Se eu executar o comando grep fora do script (e substituir as variáveis por valores reais), recebo a saída que estou esperando.

Aqui está um trecho de script. Use este script e adicione os valores listados acima.

#!/bin/bash

if [ $# -ne 3 ]; then
echo 1>&2 'This script replaces xml element’s value with the one provided as a command parameter \n\n\tUsage: $0 <xml filename> <element name> <new value>'
exit 127
fi

el_value='grep "<$2>.*<$2>" $1 | sed -e "s/^.*<$2/<$2/" | cut -f2 -d'>'| cut -f1 -d':''
echo "DEBUG: The value of el_value is '$el_value'"
    
por user34769 22.03.2013 / 18:36

2 respostas

1

Tente:

el_value=$(sed -n "s/.*<$2>\([^:<]*\).*//p" < "$1")

No seu código, os problemas eram:

  • aspas simples em torno de $2 , o que significa que não foi expandido
  • faltando / para pesquisar a tag de fechamento no comando grep .
por 22.03.2013 / 21:08
0

Eu acho que é uma questão de cotação. Dentro do seu grep & sed argument, $1 e $2 não são analisados por causa de suas aspas simples ( ' ). Experimente este:

el_value=$(grep "<$2>.*<$2>" $1 | sed -e "s/^.*<$2/<$2/" | cut -f2 -d'>'| cut -f1 -d':')
    
por 22.03.2013 / 18:45

Tags