Usando grep para exibir o segundo caractere em string?

4

Eu tenho uma string que sempre tem 3 caracteres ... o primeiro e o último são sempre os mesmos.

exemplo:

▅█

Existe uma maneira simples de exibir apenas o que está no meio? (que é o único que muda)

    
por Mr.Gando 15.11.2012 / 17:58

4 respostas

8

Sim, tente fazer isso e escolha seu método preferido =):

Com grep :

echo "ixi" | grep -oP "^.\K."

Com corte :

echo "ixi" | cut -c2

Com a bash expansão de parâmetros :

x='ixi'; echo ${x:1:1}

Com sed :

echo "ixi" | sed 's/.\(.\).//'

ou

echo "ixi" | sed 's/\(^.\|.$\)//g'

Com perl :

echo "ixi" | perl -lne 'print $& if /^.\K./'

Com ruby :

echo "ixi" | ruby -ne 'print $_.split(//)[1]'

Com awk :

echo 'ixi' | awk '{split($0, a, ""); print a[2]}'

Com python :

echo "ixi" | python -c 'print list("'$(cat)'")[1]'

ou

python -c 'import sys; print list(sys.argv[1])[1]' ixi

NOTA

  • \K reinicia a partida para zero (veja pcre doc)
  • $(cat) em python é um hack de shell para obter STDIN
por 15.11.2012 / 18:09
5

Você também pode usar sed em vez de grep :

sed 's/.\(.\).//'

Isso diz:

  1. s/ ... corresponde a expressão até o próximo caractere / .
  2. . ... corresponde ao primeiro caractere (qualquer).
  3. \(.\) ... corresponde ao próximo caractere e lembra-se dele.
  4. . ... corresponde ao terceiro caractere (qualquer).
  5. / ... denota o fim da expressão.
  6. ... substitui a string inteira correspondente ao caractere que foi lembrado.
  7. / ... fim do texto de substituição.

Assim:

$ echo "abc" | sed 's/.\(.\).//'

imprimirá:

b
    
por 15.11.2012 / 18:05
1


ou

echo "ixi" | awk '{print substr($0,2,1)}'

ou

expr "ixi" : '.\(.\).'
    
por 15.11.2012 / 19:14
1

Para variedade, aqui está uma maneira com dd :

echo ixi | dd bs=1 skip=1 count=1 2>/dev/null

Se o seu grep não suportar perl ( -P ), você poderia fazer assim:

echo ixi | grep -o . | sed -n 2p

Essas alternativas funcionam apenas para entrada de uma linha.

    
por 16.11.2012 / 09:38