Comando para extrair valor entre duas variáveis e armazená-lo em uma variável [closed]

0

Eu estou tentando extrair o valor (número) entre duas variáveis e armazenar o valor em outra variável.

Estou usando o comando sed, mas não estou obtendo nenhuma saída.

#!/usr/bin/env bash
variable1='cat $1'
variable2='echo "$variable1" | cut -c 18'
echo "$variable2"
variable3='echo "$variable1" | cut -c 60'
echo "$variable3"
string="${variable3}xyz${variable2}"
echo $string
line='sed -n '/'"$string"'/,/'"$variable2"'/ p' $1'
echo $line

Por favor, sugiram-me uma maneira de extrair o número entre $ searchString e $ variable2, digamos entre $ string que é: & xyz! e $ variable2 que é: ! , tenho 60 ou seja, & xyz! 60! Então eu preciso extrair 60.

Eu também tentei com

line='sed -nr "s/$string([0-9]+),$variable2// p" $1' 

mas quando ecoei $ line ele imprimiu todo o conteúdo do arquivo

Obrigado antecipadamente

    
por ryt 28.05.2018 / 14:51

1 resposta

1

Isso pode ser feito apenas com a substituição de parâmetros do shell:

# setup
line='hello&xyz!60!world'
string='&xyz!'
variable2='!'

# now, remove from the beginning up to the first instance of "&xyz!"
tmp=${line#*$string}

# $tmp now holds 60!world

# remove from the end the last "!" and all following characters
result=${tmp%$variable2*}
echo $result
# => 60

Parece que seu comando sed está falhando devido à vírgula

  1. sem vírgula na entrada, então nada corresponde, portanto nada é impresso

    $ set -x
    $ echo "$line" | sed -nr "s/$string([0-9]+),$variable2// p"
    + sed -nr 's/&xyz!([0-9]+),!// p'
    + echo 'hello&xyz!60!world'
    
  2. remova a vírgula, agora temos uma correspondência, mas o prefixo e o sufixo permanecem

    $ echo "$line" | sed -nr "s/$string([0-9]+)$variable2// p"
    + sed -nr 's/&xyz!([0-9]+)!// p'
    + echo 'hello&xyz!60!world'
    hello60world
    
  3. também corresponde ao texto anterior e posterior

    $ echo "$line" | sed -nr "s/.*$string([0-9]+)$variable2.*// p"
    + sed -nr 's/.*&xyz!([0-9]+)!.*// p'
    + echo 'hello&xyz!60!world'
    60
    
por 28.05.2018 / 16:24