O comando Sed é executado com valor codificado no regex, mas falha com a variável no script [duplicado]

1

Meus dados de arquivo padrão estão abaixo e eu preciso de saída como 6 ou 3 ou 8 ou 4 com base no valor da variável que é eth0 e eth1

eth0RX:6:eth0TX:3|eth1RX:8:eth1TX:4|

Abaixo, o código funciona bem

sed 's/.*eth0RX:\([0-9]\+\).*//g' $EMSTATE/packetdrop.txt

Mas falha quando eu uso variáveis dinâmicas como abaixo

rxfile=sed 's/.*$iRX:\([0-9]\+\).*//g' $EMSTATE/packetdrop.txt
    
por Agnesh Kumar Singh 02.10.2017 / 06:21

2 respostas

2

  1. Dentro de aspas simples, tudo é o que é. $i é um sinal de dólar seguido por um i . Se você quiser usar uma variável, você tem que colocar a string entre aspas duplas, algo como isto:
    "s/.*$iRX:\([0-9]\+\).*//g"
  2. Mas isso não funcionará, porque procurará uma variável chamada iRX . A maneira mais simples de consertar isso é colocar o nome da variável entre chaves, assim:
    "s/.*${i}RX:\([0-9]\+\).*//g"
  3. Você também deve colocar $EMSTATE em aspas duplas. Você pode usar "$EMSTATE"/packetdrop.txt ou "$EMSTATE/packetdrop.txt" , o que você preferir.
por 02.10.2017 / 07:05
2

A expansão da variável não acontece em uma única cotação. Use aspas duplas em vez disso. E se você quiser definir o resultado para uma variável, precisará executar sed na sintaxe de substituição de comandos $(...) e é melhor citá-la também como "$(...)" . Além disso, como $iRX pode ser um nome de variável válido melhor que ${i} .

rxfile="$(sed "s/.*${i}RX:\([0-9]\+\).*//g" "$EMSTATE/packetdrop.txt" )"
    
por 02.10.2017 / 06:59