Usando grep per visualizzare il secondo carattere nella stringa?


4

Ho una stringa che contiene sempre 3 caratteri ... il primo e l'ultimo sono sempre gli stessi.

esempio:

▁▅█

C'è un modo semplice per visualizzare solo quello nel mezzo? (che è l'unico che cambia)

Risposte:


11

Sì, prova a fare questo e scegli il tuo metodo preferito =):

Con :

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

Con :

echo "ixi" | cut -c2

Con espansione dei parametri :

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

Con :

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

o

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

Con :

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

Con :

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

Con :

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

Con :

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

o

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

NOTA

  • \Kriavvia la partita a zero (vedi pcredoc)
  • $(cat) in Python è un hack shell da ottenere STDIN

3
+1 per l'uso piacevole di grep.
Dave Jarvis,

3
Aggiunto il più ordinato:cut
Gilles Quenot,

adorava quel grep
Mr.Gando,

5

Puoi anche usare sedinvece di grep:

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

Questo dice:

  1. s/... abbina l'espressione al /personaggio successivo .
  2. . ... abbina il primo carattere (qualsiasi).
  3. \(.\) ... abbina il personaggio successivo e ricordalo.
  4. . ... corrisponde al terzo carattere (qualsiasi).
  5. / ... indica la fine dell'espressione.
  6. \1 ... sostituisci l'intera stringa corrispondente al carattere che è stato ricordato.
  7. / ... fine del testo sostitutivo.

Così:

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

Stampa:

b

1

        ︙
o

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

o

expr "ixi" : '.\(.\).'

1

Per varietà, ecco un modo con dd:

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

Se il tuo grep non supporta perl ( -P), puoi farlo in questo modo:

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

Queste alternative funzionano solo con input di una riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.