Dette spørgsmål har allerede svar her :

Kommentarer

  • Jeg synes, det andet spørgsmål er for specifikt til at være duplikat af dette. Det meste af svaret herfra vil ' ikke arbejde der, da der er forskellige krav (ved at specificere ekstra nye linjetegn).
  • Jeg tror her starten og slutmønstre kunne være hvor som helst i filen (ikke nødvendigt at gøre med nye linjer) på trods af det specifikke eksempel, beder den anden om hele linjerne.
  • @kenorb det ' er stadig den samme idé. Hovedtricket er at bruge et af de værktøjer, der kan gøre /foo/,/bar/ til at definere mønstre. Specifikationerne for mønsteret (for eksempel i slutningen) er sekundære.
  • Dette svar kan også være relevant: stackoverflow.com/a/48022994/ 2026975

Svar

grep vandt ” t hjælper dig her. Dette er et job, der bedre udføres med sed ved hjælp af rækkeviddeudtryk:

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

sed -n undertrykker den automatiske udskrivning, så linjer udskrives, hvis de udtrykkeligt bliver bedt om det. Og dette sker, når intervallet /aaa/,/cdn/ sker.

Disse rækkeviddeudtryk er også tilgængelige i awk, hvor du kan sige:

awk "/zdk/,/dke/" file 

Selvfølgelig er alle disse betingelser kan udvides til en mere streng regex som sed -n "/^aaa$/,/^cdn$/p" file for at kontrollere, at linjerne består nøjagtigt aaa og cdn, intet andet.

Kommentarer

  • Wow, jeg havde det samme problem og spurgte ikke '. Jeg brugte 2 forekomster af grep -n og sammenlignede antallet til min løsning.
  • @KipK rækkeviddeudtryk er sådan et nyttigt værktøj til denne slags problemer 🙂 Du kan Brug også awk og nogle flag, men den grundlæggende sag er ret ligetil med dette.
  • @Fedorqui, jeg får noget problem, hvis søgemønsteret indeholder xmls. ligesom jeg har brug for at søge startende med < ns0: abcd xmlns = " " >, får genoptagelsen. Men det viser < abcd xmlns = " " > også. Jeg har prøvet sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p-fil
  • @MukulAnand bedes give et eksempel, så vi kan krydstjekke
  • Enhver måde, hvordan man ikke udskrive start- og slutmønsteret selv (bortset fra at bruge hoved og hale)?

Svar

Det kan gøres af 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 opnå multiline match i grep, men du skal bruge perl-regexp til grep (-P – som ikke understøttes på alle platforme , ligesom OS X), så som en løsning erstatter vi nye linjer med _ tegn og efter grep ændrer vi dem tilbage.

Alternativt kan du bruge pcregrep , som understøtter mønstre med flere linjer (-M).

Eller brug ex:

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *