sed -n 's/^potato:[[:space:]]*//p' file.txt
Si può pensare a Grep come a un Sed ristretto, oa Sed come a un Grep generalizzato. In questo caso, Sed è uno strumento buono e leggero che fa quello che vuoi, anche se, ovviamente, esistono anche molti altri modi ragionevoli per farlo.
grep -Po 'potato:\s\K.*' file
-P
per usare l'espressione regolare Perl
-o
per produrre solo la corrispondenza
\s
per abbinare lo spazio dopo potato:
\K
per omettere la corrispondenza
.*
in modo che corrisponda al resto delle stringhe
Oppure usa le asserzioni regex:grep -oP '(?<=potato: ).*' file.txt
grep 'potato:' file.txt | sed 's/^.*: //'
grep
cerca qualsiasi riga che contenga la stringa potato:
, quindi, per ognuna di queste righe, sed
sostituisce (s///
- sostituire) qualsiasi carattere (.*
) dall'inizio della riga (^
) fino all'ultima occorrenza della sequenza :
(due punti seguiti da spazio) con la stringa vuota (s/...//
- sostituire la prima parte con la seconda parte, che è vuota).
o
grep 'potato:' file.txt | cut -d\ -f2
Per ogni riga che contiene potato:
, cut
dividerà la riga in più campi delimitati da spazio (-d\
- d
=delimitatore, \
=carattere spazio con escape, qualcosa come -d" "
avrebbe anche funzionato) e stampa il secondo campo di ciascuna di queste righe (-f2
).
o
grep 'potato:' file.txt | awk '{print $2}'
Per ogni riga che contiene potato:
, awk
stamperà il secondo campo (print $2
) che è delimitato per impostazione predefinita da spazi.
o
grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'
Tutte le righe che contengono potato:
vengono inviati a un file in linea (-e
) Script Perl che prende tutte le righe da stdin
, quindi, per ciascuna di queste righe, esegue la stessa sostituzione del primo esempio precedente, quindi la stampa.
o
awk '{if(/potato:/) print $2}' < file.txt
Il file viene inviato tramite stdin
(< file.txt
invia il contenuto del file tramite stdin
al comando a sinistra) a un awk
script che, per ogni riga che contiene potato:
(if(/potato:/)
restituisce true se l'espressione regolare /potato:/
corrisponde alla riga corrente), stampa il secondo campo, come descritto sopra.
o
perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt
Il file viene inviato tramite stdin
(< file.txt
, vedi sopra) a uno script Perl che funziona in modo simile a quello precedente, ma questa volta si assicura anche che ogni riga contenga la stringa potato:
(/potato:/
è un'espressione regolare che corrisponde se la riga corrente contiene potato:
, e, se lo fa (&&
), quindi applica l'espressione regolare descritta sopra e stampa il risultato).