Shell Script: prendi la stringa nel mezzo del testo, a volte all'inizio


9

Ho un grande file di testo in cui una parte è simile a questa (valori modificati):

JULIANA XXXX006060 LI1033322 THC BRL 730.00
XXXX006296 AA1004737 THC BRL 1,740.00
SANTOS JULIANA XXXX006668 AA1004786 THC BRL 8,150.00
SANTOS JULIANA CABINDA XXXX006697 AA1004777 THC BRL 2,325.00
SANTOS JULIANA XXXX006699 AA1004790 THC BRL 2,325.00
JULIANA BATA XXXX006141 CCC012946 THC BRL 1,460.00
JULIANA BATA XXXX006153 CCC013054 THC BRL 870.00
JULIANA XXXX006269 CCC013105 THC BRL 870.00
JULIANA XXXX006295 CCC013083 THC BRL 870.00
JULIANA BATA XXXX006305 CCC013043 THC BRL 1,460.00

Voglio sempre afferrare (con uno cuto awkqualcos'altro) la stringa che inizia con XXXX00, ma non è mai nello stesso numero di campo.

Come posso farlo in uno script di shell?

Risposte:


12

Solo grepper questo:

grep -oE 'XXXX00[0-9]*' file
  • -o: Stampa solo la parte corrispondente.
  • -E: Attiva espressioni regolari estese.
  • [0-9]*: Dopo la stringa da cercare, dovrebbero apparire solo i numeri.

Nota che il regex non ha bisogno -Edell'opzione (anche se non fa male).
Jonathan Leffler,


3

Utilizzando grepcon PCRE:

% grep -Po '(^|\s)\KXXXX00[^\s]*(?=(\s|$))' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

Puoi cavartela con -w(parola) in questo caso, nota che i caratteri costitutivi della parola sono considerati come [[:alnum:]_]:

% grep -wo 'XXXX00[^ ]*' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

2

Un paio di altri modi

Con GNU awk

awk -vRS='[[:space:]]+' '/^X{4}0{2}/' file

Con le versioni precedenti di GNU awk, --re-intervalpotrebbe essere necessario, quindi

awk --re-interval -vRS='[[:space:]]+' '/^X{4}0{2}/' file

Con tregrep

<file tr -s '[:space:]' '[\n*]' | grep '^X\{4\}0\{2\}'

1
sed 's/[^0]*  *\([^ ]*\).*/\1/' <in >out

sembra che i conteggi dei campi siano diversi perché hai un elenco di persone lì e hanno un numero diverso di nomi. ma probabilmente nessuno di loro ha un nome con 0, quindi basta tagliare completamente fino al primo spazio delimitato da una stringa con uno in esso, salvarlo e tagliare tutto ciò che segue.

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.