Kommentarer
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
/foo/,/bar/
til at definere mønstre. Specifikationerne for mønsteret (for eksempel i slutningen) er sekundære.