Kommentit
vastaus
grep
voitti ” Se ei auta sinua täällä. Tämä on työ, joka on paremmin saavutettavissa sed
-toiminnolla käyttämällä lausekkeita:
$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke
sed -n
estää automaattisen tulostuksen, joten rivit tulostetaan vain, jos sitä nimenomaisesti pyydetään. Ja näin tapahtuu, kun alue /aaa/,/cdn/
tapahtuu.
Nämä aluelausekkeet ovat saatavilla myös kohdassa awk
, jossa voit sanoa:
awk "/zdk/,/dke/" file
Tietysti kaikki nämä ehdot voidaan laajentaa tiukempaan regexiin, kuten sed -n "/^aaa$/,/^cdn$/p" file
, jotta voidaan tarkistaa, että linjat koostuvat tarkalleen aaa
ja cdn
, ei muuta.
Kommentit
- Vau, minulla oli sama ongelma, enkä ' kysynyt. Käytin kahta
grep -n
-ilmentymää ja verrasin ratkaisuni lukumäärää. - @KipK -alueen lausekkeet ovat niin hyödyllinen työkalu tällaisiin ongelmiin:) Voit käytä myös
awk
-merkkiä ja joitain lippuja, mutta perustapaus on tässä melko suoraviivainen. - @Fedorqui, saan ongelman, jos hakukuvio sisältää xml-tiedostoja. kuten minun täytyy hakea alkaen < ns0: abcd xmlns = " " >, saat uudelleenmyynnin. Mutta se näyttää < abcd xmlns = " " > myös. Olen kokeillut sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p-tiedosto
- @MukulAnand Anna esimerkki, jotta voimme tarkistaa ruudun
- Millä tahansa tavalla ei tulosta alku- ja loppukuvio itse (paitsi päätä ja häntää käytettäessä)?
Vastaa
Se voi suorittaa sed
sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file
vastaus
Tässä on komento grep
:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n"
Voit saavuttaa monirivisen haun grep
, mutta sinun on käytettävä perl-regexp-tiedostoa grep
(-P
– jota ei tueta kaikilla alustoilla , kuten OS X), joten kiertotavalla korvataan uudet rivit _
-merkillä ja grep
jälkeen muutamme ne takaisin.
Vaihtoehtoisesti voit käyttää pcregrep
, joka tukee monirivisiä malleja (-M
).
Tai käytä ex
:
ex +"/aaa/,/cdn/p" -scq! file
/foo/,/bar/
mallien määrittelemiseen. Kuvion yksityiskohdat (jotka ovat esimerkiksi lopussa) ovat toissijaisia.