Commenti
Risposta
grep
ha vinto ” t ti aiuto qui. Questo è un lavoro meglio svolto con sed
utilizzando espressioni di intervallo:
$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke
sed -n
sopprime la stampa automatica, in modo che le righe vengano stampate solo se esplicitamente richiesto. E questo accade quando si verifica lintervallo /aaa/,/cdn/
.
Queste espressioni di intervallo sono disponibili anche in awk
, dove puoi dire:
awk "/zdk/,/dke/" file
Ovviamente tutte queste condizioni possono essere estese a unespressione regolare più rigida come sed -n "/^aaa$/,/^cdn$/p" file
per verificare che le righe siano esattamente aaa
e cdn
, nientaltro.
Commenti
- Wow, ho avuto lo stesso problema e ' non me lo sono chiesto. Ho usato 2 istanze di
grep -n
e ho confrontato il numero per la mia soluzione. - Le espressioni dellintervallo @KipK sono uno strumento molto utile per questo tipo di problemi 🙂 usa anche
awk
e alcuni flag, ma il caso di base è abbastanza semplice con questo. - @Fedorqui, ho qualche problema se il modello di ricerca contiene xmls. ad esempio, devo cercare che inizi con < ns0: abcd xmlns = " " >, ottenendo il risull. Ma mostra < abcd xmlns = " " > anche. Ho provato sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p file
- @MukulAn e fornisci un esempio in modo che possiamo effettuare un controllo incrociato
- In qualsiasi modo non stampare la sequenza iniziale e quella finale (tranne che per lutilizzo di testa e coda)?
Risposta
Può essere fatto da sed
sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file
Risposta
Ecco il grep
comando:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n"
Puoi ottenere la corrispondenza su più righe in grep
, ma devi usare perl-regexp per grep
(-P
, che non è supportato su tutte le piattaforme , come OS X), quindi come soluzione alternativa “stiamo sostituendo le nuove righe con il carattere _
e dopo grep
, li “cambiamo di nuovo.
In alternativa puoi utilizzare pcregrep
che supporta modelli su più righe (-M
).
Oppure utilizza ex
:
ex +"/aaa/,/cdn/p" -scq! file
/foo/,/bar/
per definire i modelli. Le specifiche del pattern (ad esempio alla fine) sono secondarie.