Usando o SED para derivar os valores de uma String

2

Eu quero usar echo "123|456|789" | sed 's/^\(.*|\)\(.*|\).*$/'

Estou tentando quebrar a string e obter os valores individuais (sem o pipe |).

  • Cenário 1: desejo receber 123
  • Cenário 2: desejo receber 456
  • Cenário 3: desejo receber 789
  • Cenário 4: desejo receber 123 456 789
por AlluSingh 07.07.2017 / 20:20

4 respostas

1

Como não tenho certeza do que você quer que isso faça, vou limitar minha resposta a consertar o comando. Deve ser:

echo "123 | 456 | 789" | sed 's / ^ (. |) (. |). * $ / \ 1 /'

(observe o / imediatamente antes do último caractere de aspas).

Isso, então, dá a saída:

123 |

É isso que você queria?

    
por 07.07.2017 / 21:17
1
  1. echo '123|456|789' | sed 's/|.*//'
  2. echo '123|456|789' | sed 's/^[0-9]*|//;s/|.*//'
  3. echo '123|456|789' | sed 's/.*|//'
  4. echo '123|456|789' | sed 's/|/ /g'

Ou se você não é precioso sobre o uso de sed

  1. echo '123|456|789' | cut -f1 -d\|
  2. echo '123|456|789' | cut -f2 -d\|
  3. echo '123|456|789' | cut -f3 -d\|
  4. echo '123|456|789' | cut -f1,2,3 --output-delimiter=" " -d\|
por 07.07.2017 / 23:09
0

Minha resposta anterior corrigiu um erro. Aqui está a maneira que eu realmente resolveria:

O cenário 4 é o mais complicado, então aqui está a solução:

echo '123|456|789' | sed 's/\([0-9]*\)|\([0-9]*\)|\([0-9]*\)/  /'

O \ 1, \ 2 e \ 3 no final selecionam a parte combinada entre os 'colchetes decorados' (o \ (e \)). Cada conjunto desses é referenciado pelo próximo número, então \ 1 para o primeiro, etc.

Para os cenários 1, 2 e 3, você pode simplificar isso, mas é mais fácil apenas recortar e colar, e depois apenas \ 1, \ 2 ou \ 3 conforme necessário entre o último conjunto de //. Não vai doer deixar o resto dos parênteses decorados lá.

Esta solução pode ser expandida para qualquer número de campos, embora eu prefira usar o corte, se possível.

    
por 08.07.2017 / 18:43
0

Com o GNU sed você pode capturar seus campos mencionando seu número no shell var $n

n=2; # to get field number 2
echo "123|456|789" | sed -n "s/|/\n/$n;s/^[^\n]*|//;P"

enquanto que para o cenário 4 é:

echo ... | sed -e 'y/|/ /'
    
por 08.07.2017 / 19:26