Vorrei ottenere la corrispondenza multi pattern con AND implicito tra pattern, cioè equivalente a eseguire più greps in una sequenza:
grep pattern1 | grep pattern2 | ...
Quindi, come convertirlo in qualcosa di simile?
grep pattern1 & pattern2 & pattern3
Vorrei usare single grep perché sto costruendo argomenti in modo dinamico, quindi tutto deve stare in una stringa. L'uso del filtro è una funzionalità di sistema, non grep, quindi non è un argomento a favore.
Non confondere questa domanda con:
grep "pattern1|pattern2|..."
Questo è un OR corrispondenza di più modelli.
Risposta accettata:
agrep
può farlo con questa sintassi:
agrep 'pattern1;pattern2'
Con GNU grep
, se creato con il supporto PCRE, puoi fare:
grep -P '^(?=.*pattern1)(?=.*pattern2)'
Con ast grep
:
grep -X '.*pattern1.*&.*pattern2.*'
(aggiungendo .*
s come <x>&<y>
corrisponde a stringhe che corrispondono a entrambi <x>
e <y>
esattamente , a&b
non corrisponderebbe mai perché non esiste una stringa del genere che può essere entrambi a
e b
allo stesso tempo).
Se i motivi non si sovrappongono, potresti anche essere in grado di fare:
grep -e 'pattern1.*pattern2' -e 'pattern2.*pattern1'
Il miglior modo portatile è probabilmente con awk
come già accennato:
awk '/pattern1/ && /pattern2/'
Con sed
:
sed -e '/pattern1/!d' -e '/pattern2/!d'
Tieni presente che tutti avranno una sintassi diversa per le espressioni regolari.