Hur grepar du ett blanksteg i text?
cat a.txt| grep " "
eller
cat a.txt| grep "\s "
Kommentarer
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 avgrep
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.
cat
i båda fallen. Den första kunde skrivasgrep ' ' a.txt
, den andra ändrades på samma sätt.\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]
.-m
-alternativ) till en …