Hvordan tar jeg tak i ett mellomrom i tekst?
cat a.txt| grep " "
eller
cat a.txt| grep "\s "
Kommentarer
Svar
Hvis du vil grep for bare ett mellomrom når du legger inn spørsmålet ditt, vil du bruke noe sånt som:
grep -e "^\s[^\s]" -e "[^\s]\s$" -e "[^\s]\s[^\s]" a.txt
eller for POSIX-varianter:
grep -e "^ [^ ]" -e "[^ ] $" -e "[^ ] [^ ]" a.txt
eller den mindre lesbare POSIX-varianten:
grep "\(^\|[^ ]\)\ \([^ ]\|$)" a.txt
Forutsatt at du vil ekskludere linjer som inneholder mer enn ett tilstøtende mellomrom , krever dette eksplisitt at det er ett mellomrom, ikke innledes med et mellomrom og ikke etterfulgt av et mellomrom.
Det er også verdt å merke seg at ikke alle versjoner av grep støtter reguleringsuttrykk.
Kommentarer
- Du kan utelate alle disse tilbakeslagene fra det siste eksemplet og forbedre lesbarheten ved å bruke det POSIX-spesifiserte
-E
-alternativet som muliggjør utvidede regekser.grep -E '(^|[^ ]) ([^ ]|$)' a.txt
I alle fall er tilbakeslaget før mellomrommet ikke ' t nødvendig, og det mangler ' før den endelige parentesen. for versjoner avgrep
som forstår\s
, kan du forkorte uttrykket for ikke-mellomrom[^\s]
til\S
- Dette fungerer imidlertid også, [[: blank:]]
Svar
Jeg tror jeg fant det:
grep "\+[[:space:]]\+" a.xml
Svar
Variant 2 finner bare to mellomrom. Hvis du bruker "\s"
i stedet fungerer begge variantene.
Du kan enkelt teste dette selv, så hva er det faktiske spørsmålet ditt?
Kommentarer
- Hvorfor bare finne to mellomrom? Jeg tror det samsvarer med hvilket som helst mellomrom.
- @Gnouc: Variant 2 når han skriver det
'\s '
vil samsvare med minst to mellomrom på rad, fordi han la til et mellomrom tegn etter tegngruppen\s
. - Du ' har rett, jeg har ikke ' t se mellomrommet etter
\s
, min feil.
cat
i begge tilfeller. Den første kunne skrivesgrep ' ' a.txt
, den andre ble endret på samme måte.\s
også samsvarer med tab, return, vertikal fane, skjemafôr og teknisk ny linje. Hvis du bare vil matche mellomrom og fane, bruk[[:blank:]]
eller[ \t]
.-m
-alternativet) til en …