<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Den här frågan har redan svar här :

Kommentarer

  • Jag tycker att den andra frågan är för specifik för att vara duplikat av denna. Det mesta av svaret härifrån vann inte ', eftersom det finns olika krav (genom att ange extra nya radtecken).
  • Jag tror här början och slutmönster kan vara var som helst i filen (inget nödvändigt att göra med nya rader) trots det specifika exemplet, den andra ber om hela raderna.
  • @kenorb det ' är fortfarande samma idé. Huvudtricket är att använda ett av verktygen som kan göra /foo/,/bar/ för att definiera mönster. Specifikationerna för mönstret (till exempel i slutet) är sekundära.
  • Det här svaret kan också vara tillämpligt: stackoverflow.com/a/48022994/ 2026975

Svar

grep vann ” Det här är ett jobb som bättre utförs med sed med hjälp av intervalluttryck:

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

sed -n undertrycker den automatiska utskriften, så att rader skrivs ut om de uttryckligen ombeds att göra det. Och detta händer när intervallet /aaa/,/cdn/ händer.

Dessa intervalluttryck finns också i awk, där du kan säga:

awk "/zdk/,/dke/" file 

Naturligtvis, alla dessa villkor kan utökas till en striktare regex som sed -n "/^aaa$/,/^cdn$/p" file för att kontrollera att raderna består exakt på aaa och cdn, inget annat.

Kommentarer

  • Oj, jag hade samma problem och frågade inte '. Jag använde två förekomster av grep -n och jämförde numret för min lösning.
  • @KipK intervalluttryck är ett så användbart verktyg för den här typen av problem 🙂 Du kan använd också awk och några flaggor, men det grundläggande fallet är ganska rakt framåt med detta.
  • @Fedorqui, jag får lite problem om sökmönstret innehåller xmls. som, jag måste söka från < ns0: abcd xmlns = " " >, få återupptagning. Men det visar < abcd xmlns = " " > också. Jag har provat sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p-fil
  • @MukulAnand ge ett exempel så att vi kan korsa kryssrutan
  • Hur som helst inte skriva ut start- och slutmönstret själva (förutom att använda huvud och svans)?

Svar

Det kan göras av sed

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

Svar

Här är grep kommando:

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

Du kan uppnå flerlinjig matchning i grep, men du måste använda perl-regexp för grep (-P – vilket inte stöds på alla plattformar , som OS X), så som lösning ersätter vi nya rader med _ karaktär och efter grep ändrar vi tillbaka dem.

Alternativt kan du använda pcregrep som stöder mönster med flera rader (-M).

Eller använd ex:

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *