Hoe één spatie in tekst grepen?

cat a.txt| grep " " 

of

cat a.txt| grep "\s " 

Reacties

  • Onnodig gebruik van cat in beide gevallen. De eerste kan worden geschreven als grep ' ' a.txt, de tweede kan op dezelfde manier worden gewijzigd.
  • Merk op dat \s ook overeenkomt met tab, return, verticaal tabblad, form feed en, technisch gezien, newline. Als je alleen spatie en tab wilt matchen, gebruik dan [[:blank:]] of [ \t].
  • met gnu grep kun je beperk het aantal overeenkomsten (-m optie) tot één …
  • Dit is eenvoudiger egrep " \ s " a.txt

Antwoord

Als je wilt grep voor slechts één spatie zoals u in uw vraag invoert, zou u zoiets als:

grep -e "^\s[^\s]" -e "[^\s]\s$" -e "[^\s]\s[^\s]" a.txt 

of voor POSIX-varianten gebruiken:

grep -e "^ [^ ]" -e "[^ ] $" -e "[^ ] [^ ]" a.txt 

of de minder leesbare POSIX-variant:

grep "\(^\|[^ ]\)\ \([^ ]\|$)" a.txt 

Ervan uitgaande dat u regels wilt uitsluiten die meer dan één aangrenzende spatie bevatten , vereist dit expliciet dat er één spatie is, niet voorafgegaan door een spatie en niet gevolgd door een spatie.

Het is ook vermeldenswaard dat niet alle versies van grep “\ s” regelaars voor reguliere expressies ondersteunen.

Opmerkingen

  • U kunt al die backslashes uit het laatste voorbeeld weglaten en de leesbaarheid verbeteren door de POSIX-gespecificeerde -E -optie te gebruiken die uitgebreide regexes mogelijk maakt. grep -E '(^|[^ ]) ([^ ]|$)' a.txt In ieder geval is de backslash vóór de spatie n ' t nodig en er ontbreekt ' een voor het laatste haakje sluiten. voor versies van grep die \s begrijpen, kunt u de uitdrukking voor niet-spatie [^\s] naar \S
  • Dit werkt echter ook, [[: blank:]]

Antwoord

Ik denk dat ik het gevonden heb:

grep "\+[[:space:]]\+" a.xml 

Antwoord

Variant 2 vindt slechts twee spaties. Als u "\s" in plaats daarvan zullen beide varianten werken.

Je zou dit gemakkelijk zelf kunnen testen, dus wat is je eigenlijke vraag?

Opmerkingen

  • Waarom vind je maar twee spaties? Ik denk dat het overeenkomt met elke spatie.
  • @Gnouc: Variant 2 terwijl hij het schrijft '\s ' komt overeen met ten minste twee spaties achter elkaar, omdat hij een spatie heeft toegevoegd teken na de tekengroep \s.
  • Jij ' hebt gelijk, ik heb geen ' zie de spatie na \s, mijn fout.

Geef een reactie

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