Como faço para analisar um arquivo como este e definir as variáveis? [fechadas]

2

Arquivo de exemplo:

/Variable1=Value1/Variable2=Value Value Value/Variable3=Value3 Value3/ 

Eu quero ler as variáveis e defini-las. Isso significa que eu seria capaz de digitar echo $Variable1 e obter Value1 como saída, etc. Eu tentei muitas coisas, mas elas eram muito longas e não funcionavam quando as variáveis mudavam de nome. Alguém sabe um método eficaz para isso?

    
por DisplayName 17.12.2015 / 21:26

5 respostas

3

Este é um ponto de partida bash :

OIFS="$IFS"
IFS=/; set -f
for piece in $(cat file)
do
  var=$(echo "$piece" | cut -d= -f1)
  val=$(echo "$piece" | cut -d= -f2-)
  [ -n "$var" ] && eval $var=\"$val\"
done
IFS="$OIFS"
unset piece var val

Enquanto ele ignora nomes de variáveis vazios, isso não faz nenhuma verificação de sanidade dos próprios nomes das variáveis.

Segunda maneira, desde que eu estava determinado a encontrar uma maneira de fazer isso com read :

declare -a vars
IFS=/ read -a vars < file
for piece in ${vars[*]}
do 
  mangle=$(echo "$piece" | sed 's/=\(.*\)/=""/')
  eval $mangle
done
unset vars piece mangle

A linha mangle está ali apenas para citar o valor após o sinal de igual.

    
por 17.12.2015 / 21:53
2

semelhante à resposta de Jeff Schaller:

IFS=/; set -f
set -- $(tr /\n \n/ <file |
         sed -ne's/^[_[:alpha:]][_[:alnum:]]*=/_&/p' |
         tr /\n \n/)
for v do eval "${v%%=*}=\${v#*=}"; done
    
por 17.12.2015 / 22:09
1
. <(
    awk '
      BEGIN{RS="/";FS="="}
      NF==2{printf "%s=\"%s\"\n", $1, $2}
    ' file
)

Este usa awk para fazer o seguinte texto:

Variable1="Value1"
Variable2="Value Value Value"
Variable3="Value3 Value3"

Isso é originado, portanto, Variable{1,2,3} estão disponíveis em sh .

Alguns pontos: os valores são considerados como não contendo formiga / , = ou " .

    
por 17.12.2015 / 22:19
1
$ printf "%s\n" "$Variable1" "$Variable2" "$Variable3"



$ cat file
/Variable1=Value1/Variable2=Value Value Value/Variable3=Value3 Value3/ 
$ source <(tr / "\n" < file | sed -r 's/=(.*)/=""/')
$ printf "%s\n" "$Variable1" "$Variable2" "$Variable3"
Value1
Value Value Value
Value3 Value3
    
por 17.12.2015 / 22:24
0

Para bash: (se sua string estiver em um arquivo chamado 'liste.txt')

IFS="/"
for val in $(cat liste.txt); do echo "$val" | sed -r "s/=(.*)$/=\"\"/g" | eval; done

Depois, você só precisa tentar:

echo "$Varaible1"
echo "$Variable2"

e assim por diante

    
por 17.12.2015 / 22:09