Questa domanda ha già una risposta qui :

Commenti

  • Penso che laltra domanda sia troppo specifica per essere duplicata di questa. La maggior parte delle risposte da qui non ha ' funzionare lì, poiché ci sono requisiti diversi (specificando caratteri di nuova riga extra).
  • Penso che qui linizio e i modelli finali potrebbero essere ovunque nel file (non è necessario che abbia a che fare con nuove righe) nonostante, dato lesempio specifico, laltro richieda le righe intere.
  • @kenorb it ' è sempre la stessa idea. Il trucco principale è utilizzare uno degli strumenti che possono eseguire /foo/,/bar/ per definire i modelli. Le specifiche del pattern (ad esempio alla fine) sono secondarie.
  • Questa risposta potrebbe anche essere applicabile: stackoverflow.com/a/48022994/ 2026975

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 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *