Hur grepar du ett blanksteg i text?

cat a.txt| grep " " 

eller

cat a.txt| grep "\s " 

Kommentarer

  • Otillbörlig användning av cat i båda fallen. Den första kunde skrivas grep ' ' a.txt, den andra ändrades på samma sätt.
  • Observera att \s också matchar tab, return, vertikal flik, formulärmatning och tekniskt sett ny linje. Om du bara vill matcha utrymme och flik använder du [[:blank:]] eller [ \t].
  • med gnu grep kan du begränsa antalet matchningar (-m -alternativ) till en …
  • Det här är enklare, t.ex. " \ s " a.txt

Svar

Om du vill grep för bara ett utrymme när du ställer in din fråga, skulle du använda något som:

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

eller för POSIX-varianter:

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

eller den mindre läsbara POSIX-varianten:

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

Förutsatt att du vill utesluta rader som innehåller mer än ett intilliggande utrymme , detta kräver uttryckligen att det finns ett utrymme, inte föregås av ett mellanslag och inte följt av ett mellanslag.

Det är också värt att notera att inte alla versioner av grep stöder ”\ s” reguljära uttryckskontroller.

Kommentarer

  • Du kan utelämna alla dessa snedstreck från det senaste exemplet och förbättra läsbarheten genom att använda det POSIX-specificerade -E -alternativet som möjliggör utökade regexes. grep -E '(^|[^ ]) ([^ ]|$)' a.txt I vilket fall som helst är backslash före mellanslaget inte ' t behövs och ' saknas innan den slutliga parentesen. för versioner av grep som förstår \s kan du förkorta uttrycket för icke-mellanslag [^\s] till \S
  • Men detta fungerar också, [[: blank:]]

Svar

Jag tror att jag hittade det:

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

Svar

Variant 2 hittar bara två mellanslag. Om du använder "\s" istället fungerar båda varianterna.

Du kan enkelt testa detta själv, så vad är din faktiska fråga?

Kommentarer

  • Varför bara hitta två mellanslag? Jag tror att det matchar vilket utrymme som helst.
  • @Gnouc: Variant 2 när han skriver det '\s ' kommer att matcha minst två mellanslag i rad, eftersom han lade till ett mellanslag karaktär efter karaktärsgruppen \s.
  • Du ' har rätt, jag har inte ' t se utrymmet efter \s, mitt misstag.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *