Kommentarer
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
/foo/,/bar/
för att definiera mönster. Specifikationerna för mönstret (till exempel i slutet) är sekundära.