Reacties
Antwoord
grep
won ” Ik kan je hier helpen. Dit is een taak die je beter kunt uitvoeren met sed
met behulp van bereikuitdrukkingen:
$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke
sed -n
onderdrukt het automatisch afdrukken, zodat regels worden afgedrukt als er expliciet om wordt gevraagd. En dit gebeurt wanneer het bereik /aaa/,/cdn/
plaatsvindt.
Deze bereikuitdrukkingen zijn ook beschikbaar in awk
, waar u kunt zeggen:
awk "/zdk/,/dke/" file
Natuurlijk deze voorwaarden kunnen worden uitgebreid naar een meer strikte regex zoals sed -n "/^aaa$/,/^cdn$/p" file
om te controleren of de regels precies bestaan uit aaa
en cdn
, niets anders.
Reacties
- Wauw, ik had hetzelfde probleem en ' niet gevraagd. Ik heb 2 exemplaren van
grep -n
gebruikt en het aantal voor mijn oplossing vergeleken. - Uitdrukkingen uit het @KipK-bereik zijn zon handig hulpmiddel voor dit soort problemen 🙂 Je kunt gebruik ook
awk
en enkele vlaggen, maar het basisgeval is hiermee vrij eenvoudig. - @Fedorqui, ik krijg een probleem als het zoekpatroon xmls bevat. zoals, ik moet zoeken beginnend met < ns0: abcd xmlns = " " >, de resolutie ophalen. Maar het toont < abcd xmlns = " " > ook. Ik heb sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p file
- @MukulAnand geef alstublieft een voorbeeld zodat we het kunnen checken
- Elke manier om niet print het begin- en eindpatroon zelf (behalve voor het gebruik van kop en staart)?
Answer
Het kan worden gedaan door sed
sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file
Antwoord
Hier is grep
commando:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n"
U kunt een overeenkomst op meerdere regels bereiken in grep
, maar je moet perl-regexp gebruiken voor grep
(-P
– wat niet op elk platform wordt ondersteund , zoals OS X), dus als tijdelijke oplossing “vervangen we nieuwe regels door _
teken en na grep
, veranderen we ze terug.
Je kunt ook die patronen met meerdere regels ondersteunt (-M
).
Of gebruik ex
:
ex +"/aaa/,/cdn/p" -scq! file
/foo/,/bar/
kunnen gebruiken om patronen te definiëren. De specifieke kenmerken van het patroon (bijvoorbeeld aan het einde) zijn secundair.