Come posso cercare due frasi diverse quando sono su due righe diverse usando un singolo grep
comando?
Per esempio
Linea 1: questo è un dolce.
Linea 2: limone.
Ho usato questo ma nessun risultato
grep "sweet.*lemon" file_type
Come posso cercare due frasi diverse quando sono su due righe diverse usando un singolo grep
comando?
Per esempio
Linea 1: questo è un dolce.
Linea 2: limone.
Ho usato questo ma nessun risultato
grep "sweet.*lemon" file_type
Risposte:
Per usare grep
due linee diverse, cerca entrambi i motivi
$ grep -e sweet -e lemon file_type
This is a sweet
lemon.
Oppure usa l'alternanza
$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.
Per ottenere la riga successiva dopo un modello, è possibile utilizzare l'opzione di contesto
$ grep -A1 sweet file_type
This is a sweet
lemon.
Ma se siete alla ricerca in modo esplicito per un modello più righe, è perché difficile grep
pensa in linee ... . Potrai .*
prendere tutto tra "dolce" e "limone" sulla linea . Possiamo ottenere "lemon" sulla riga successiva -P
usando \n
per abbinare la newline e dicendo che grep
il file è nullo separato da -z
:
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
-E
Usa espressioni regolari estese (per usare il |
carattere per l'alternanza senza dover scappare)-An
Stampa linee aggiuntive dopo il motivo, dove n è il numero di linee finali da stampare-P
Usa espressioni regolari in stile perl ("sperimentale" in grep
- install pcregrep
invece per un migliore supporto perl regex)-z
Usa il carattere null come separatore (fingendo solo in questo caso, ma grep
prenderà la nostra parola per farlo)-o
stampa solo la parte corrispondente-o
... modificato ...
grep: The -P and -z options cannot be combined
- ad es. Grep (GNU grep) 2.5.1 su RHEL
Come questo:
grep "sweet\|lemon"
grep
per le opere di default in "modalità standard", in cui "i caratteri speciali", come |
, +
, *
sono interpretati letteralmente a meno che stanno mascherati con un backslash. Vedi ad esempio questa risposta . Per usare il modo in cui sei probabilmente abituato, che i "caratteri speciali" devono essere mascherati per essere interpretati letteralmente, devi passare alla "modalità estesa" ( grep -E
). Forse Madneon potrebbe approfondire un po 'di più le sue risposte, ad esempio a cosa avrebbero provato i PO ?
grep -zP
comando funzionerebbe in questo caso specifico (un file composto esattamente da due righe), in generale considererebbe qualsiasi file ordinario separato da una nuova riga come una singola riga, quindi scarica l'intero contenuto del file (se c'è una corrispondenza da qualche parte) o niente; di solito non è quello che la gente usagrep
.