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 comandogrep
.
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'"
Tente:
el_value=$(sed -n "s/.*<$2>\([^:<]*\).*//p" < "$1")
No seu código, os problemas eram:
$2
, o que significa que não foi expandido /
para pesquisar a tag de fechamento no comando grep
. 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':')