Deze vraag heeft hier al antwoorden :

Reacties

  • Ik denk dat de andere vraag te specifiek is om hier een duplicaat van te zijn. De meeste antwoorden van hier hebben ' daar niet gewerkt, omdat er verschillende vereisten zijn (door extra nieuwe lijntekens op te geven).
  • Ik denk dat hier het begin en eindpatronen kunnen overal in het bestand voorkomen (niet nodig met nieuwe regels), ondanks het specifieke voorbeeld, de andere vraagt om de hele regels.
  • @kenorb it ' s nog steeds hetzelfde idee. De belangrijkste truc is om een van de tools te gebruiken die /foo/,/bar/ kunnen gebruiken om patronen te definiëren. De specifieke kenmerken van het patroon (bijvoorbeeld aan het einde) zijn secundair.
  • Dit antwoord kan ook van toepassing zijn: stackoverflow.com/a/48022994/ 2026975

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 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *