Come posso cercare due frasi diverse quando sono su due righe diverse usando un singolo grepcomando?
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 grepcomando?
Per esempio
Linea 1: questo è un dolce.
Linea 2: limone.
Ho usato questo ma nessun risultato
grep "sweet.*lemon" file_type
Risposte:
Per usare grepdue 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 greppensa in linee ... . Potrai .*prendere tutto tra "dolce" e "limone" sulla linea . Possiamo ottenere "lemon" sulla riga successiva -Pusando \nper abbinare la newline e dicendo che grepil file è nullo separato da -z:
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
-EUsa 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-PUsa espressioni regolari in stile perl ("sperimentale" in grep- install pcregrepinvece per un migliore supporto perl regex)-zUsa il carattere null come separatore (fingendo solo in questo caso, ma grepprenderà 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"
grepper 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 -zPcomando 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.