Ennek a kérdésnek már itt megválaszolva van :

Megjegyzések

  • Úgy gondolom, hogy a másik kérdés túl specifikus ahhoz, hogy duplikálja ezt. Az innen érkező válaszok zöme ' nem fog ott működni, mivel különböző követelmények vannak (extra új sor karakterek megadásával).
  • Szerintem itt a kezdet és a a végminták bárhol lehetnek a fájlban (nem szükséges új sorokkal foglalkozni), a konkrét példa ellenére a másik az egész sort kéri.
  • @kenorb it ' s továbbra is ugyanaz az ötlet. A fő trükk az egyik olyan eszköz használata, amely a /foo/,/bar/ funkcióval meg tudja határozni a mintákat. A minta sajátosságai (például a végén találhatók) másodlagosak.
  • Ez a válasz is alkalmazható: stackoverflow.com/a/48022994/ 2026975

Válasz

grep nyert ” Nem segít itt. Ez egy olyan feladat, amelyet jobban el lehet érni a sed használatával a tartomány kifejezések használatával:

$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke 

sed -n elnyomja az automatikus nyomtatást, így a sorok kinyomtatásra kerülnek, ha kifejezetten erre kérik. És ez akkor történik, amikor a /aaa/,/cdn/ tartomány megtörténik.

Ezek a tartománykifejezések a awk könyvtárban is elérhetők, ahol a következőket mondhatja:

awk "/zdk/,/dke/" file 

Természetesen minden ezek a feltételek kibővíthetők egy szigorúbb regexre, például sed -n "/^aaa$/,/^cdn$/p" file annak ellenőrzésére, hogy a vonalak pontosan aaa és cdn, semmi más.

Megjegyzések

  • Hú, ugyanaz a problémám volt, és nem kérdeztem ' t. A grep -n két példányát használtam, és összehasonlítottam a megoldás számát.
  • A @KipK tartománykifejezések olyan hasznos eszközek az ilyen típusú problémákhoz:) használjon awk -t és néhány zászlót is, de ezzel az alapeset meglehetősen egyszerű.
  • @Fedorqui, problémát kapok, ha a keresési minta xml-eket tartalmaz. hasonlóan, a következővel kell kezdeni: < ns0: abcd xmlns = " " >, megkapja az újraértékelést. De ez mutatja: < abcd xmlns = " " > is. Kipróbáltam a sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p fájl
  • @MukulAnand adjon meg egy példát, hogy ellenőrizhessük az ellenőrzést
  • Bármilyen módon nem maguk nyomtassák ki a kezdő és a végmintát (kivéve a fej és a farok használatát)?

Válasz

sed

sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file 

Válasz

Itt van a grep parancs:

grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n" 

Többsoros egyezést érhet el a , de a grep (-P – perl-regexp szót kell használnia – amelyet nem minden platform támogat , mint az OS X), így megoldásként új sorokat cserélünk _ karakterre és grep után visszaváltjuk őket.

Alternatív megoldásként használhatja a pcregrep , amely támogatja a többsoros mintákat (-M).

Vagy használja a ex:

ex +"/aaa/,/cdn/p" -scq! file 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük