Această întrebare are deja răspunsuri aici :
Comentarii
Răspuns
grep
a câștigat ” Vă ajutăm aici. Aceasta este o lucrare mai bine realizată cu sed
folosind expresii de interval:
$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke
sed -n
suprimă tipărirea automată, astfel încât liniile să fie tipărite doar dacă li se solicită în mod explicit. Și acest lucru se întâmplă când se întâmplă intervalul /aaa/,/cdn/
.
Aceste expresii de gamă sunt disponibile și în awk
, unde puteți spune:
awk "/zdk/,/dke/" file
Desigur, toate aceste condiții pot fi extinse la o regex mai strictă ca sed -n "/^aaa$/,/^cdn$/p" file
pentru a verifica dacă liniile constau exact pe aaa
și cdn
, nimic altceva.
Comentarii
- Uau, am avut aceeași problemă și nu am întrebat '. Am folosit 2 instanțe de
grep -n
și am comparat numărul soluției mele.
- Expresiile de gamă @KipK sunt un instrument atât de util pentru acest tip de probleme:) Puteți utilizați, de asemenea,
awk
și câteva stegulețe, dar cazul de bază este destul de direct în acest sens.
- @Fedorqui, am ceva probleme dacă modelul de căutare conține xmls. cum ar fi, trebuie să caut după < ns0: abcd xmlns = " " >, obținând resul. Dar se afișează < abcd xmlns = " " >, de asemenea. Am încercat sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p fișier
- @MukulAn și vă rugăm să furnizați un exemplu, astfel încât să putem verifica încrucișat
- Orice mod cum să nu tipăriți singuri modelul de început și sfârșit (cu excepția utilizării capului și a cozii)?
Răspuns
Poate fi făcut de sed
sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file
Răspuns
Iată grep
comanda:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n"
Puteți obține o potrivire multilinie în grep
, dar trebuie să utilizați perl-regexp pentru grep
(-P
– care nu este acceptat pe fiecare platformă , cum ar fi OS X), deci, ca soluție, înlocuim noi linii cu caracterul _
și după grep
, le schimbăm înapoi.
Alternativ, puteți utiliza pcregrep
care acceptă modele cu mai multe linii (-M
).
Sau utilizați ex
:
ex +"/aaa/,/cdn/p" -scq! file