Kommentarer
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
/foo/,/bar/
for å definere mønstre. Spesifikasjonene til mønsteret (for eksempel på slutten) er sekundære.