Dette spørsmålet har allerede svar her :

Kommentarer

  • Jeg synes det andre spørsmålet er for spesifikt til å være duplikat av dette. Det meste av svaret herfra vil ikke ' ikke fungere der, da det er forskjellige krav (ved å spesifisere ekstra nye linjetegn).
  • Jeg tror her begynnelsen og sluttmønstre kan være hvor som helst i filen (ikke nødvendig å gjøre med nye linjer) til tross for gitt det spesifikke eksemplet, spør den andre om hele linjene.
  • @kenorb det ' er fortsatt den samme ideen. Hovedtrikset er å bruke et av verktøyene som kan gjøre /foo/,/bar/ for å definere mønstre. Spesifikasjonene til mønsteret (for eksempel på slutten) er sekundære.
  • Dette svaret kan også være aktuelt: stackoverflow.com/a/48022994/ 2026975

Svar

grep vant » t hjelpe deg her. Dette er en jobb som er bedre utført med sed ved å bruke rekkeviddeuttrykk:

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

sed -n undertrykker automatisk utskrift, slik at linjer skrives ut bare hvis eksplisitt blir bedt om det. Og dette skjer når området /aaa/,/cdn/ skjer.

Disse rekkeviddeuttrykkene er også tilgjengelige i awk, der du kan si:

awk "/zdk/,/dke/" file 

Selvfølgelig, alle disse vilkårene kan utvides til en strengere regeks som sed -n "/^aaa$/,/^cdn$/p" file for å kontrollere at linjene består av nøyaktig aaa og cdn, ingenting annet.

Kommentarer

  • Wow, jeg hadde det samme problemet og spurte ikke '. Jeg brukte to forekomster av grep -n og sammenlignet tallet for løsningen min.
  • @KipK rekkeviddeuttrykk er et så nyttig verktøy for denne typen problemer 🙂 Du kan bruk også awk og noen flagg, men den grunnleggende saken er ganske rett frem med dette.
  • @Fedorqui, jeg får noen problemer hvis søkemønsteret inneholder xmls. som, jeg må søke fra < ns0: abcd xmlns = " " >, får resultatet. Men det viser < abcd xmlns = " " > også. Jeg har prøvd sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p-fil
  • @MukulAnand vennligst gi et eksempel slik at vi kan kryssjekke
  • På en eller annen måte hvordan vi ikke skrive ut start- og sluttmønsteret selv (bortsett fra å bruke hode og hale)?

Svar

Det kan gjøres av sed

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

Svar

Her er grep kommando:

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

Du kan oppnå flerlinjekamp i grep, men du må bruke perl-regexp for grep (-P – som ikke støttes på alle plattformer , som OS X), så som en løsning bytter vi ut nye linjer med _ tegn og etter grep endrer vi dem tilbake.

Alternativt kan du bruke pcregrep som støtter flerlinjemønstre (-M).

Eller bruk ex:

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *