Hvordan grep et mellemrum i tekst?
cat a.txt| grep " "
eller
cat a.txt| grep "\s "
Kommentarer
Svar
Hvis du vil grep for kun et mellemrum, som du stiller i dit spørgsmål, vil du bruge noget som:
grep -e "^\s[^\s]" -e "[^\s]\s$" -e "[^\s]\s[^\s]" a.txt
eller til POSIX-varianter:
grep -e "^ [^ ]" -e "[^ ] $" -e "[^ ] [^ ]" a.txt
eller den mindre læsbare POSIX-variant:
grep "\(^\|[^ ]\)\ \([^ ]\|$)" a.txt
Forudsat at du vil ekskludere linjer, der indeholder mere end et tilstødende mellemrum , dette kræver eksplicit, at der er et mellemrum, ikke forud for et mellemrum og ikke efterfulgt af et mellemrum.
Det er også værd at bemærke, at ikke alle versioner af grep understøtter “\ s” regulært udtryk.
Kommentarer
- Du kan udelade alle disse tilbageslag fra det sidste eksempel og forbedre læsbarheden ved hjælp af den POSIX-specificerede
-E
mulighed, der muliggør udvidede regexes.grep -E '(^|[^ ]) ([^ ]|$)' a.txt
Under alle omstændigheder er backslash før mellemrummet ikke ' t nødvendigt, og der mangler ' før den sidste afsluttende parentes. Også, til versioner afgrep
, der forstår\s
, kan du forkorte udtrykket for ikke-mellemrum[^\s]
til\S
- Dette fungerer dog også, [[: blank:]]
Svar
Jeg tror, jeg fandt det:
grep "\+[[:space:]]\+" a.xml
Svar
Variant 2 finder kun to mellemrum. Hvis du bruger "\s"
i stedet fungerer begge varianter.
Du kan nemt teste dette selv, så hvad er dit aktuelle spørgsmål?
Kommentarer
- Hvorfor kun finde to mellemrum? Jeg synes, det matcher ethvert mellemrum.
- @Gnouc: Variant 2, da han skriver det
'\s '
matcher mindst to mellemrum i træk, fordi han tilføjede et mellemrum tegn efter tegngruppen\s
. - Du ' har ret, jeg har ikke ' Se ikke mellemrummet efter
\s
, min fejltagelse.
cat
i begge tilfælde. Den første kunne skrivesgrep ' ' a.txt
, den anden blev ændret på samme måde.\s
matcher også tab, return, lodret fane, formularfeed og teknisk set newline. Hvis du kun vil matche mellemrum og fane, skal du bruge[[:blank:]]
eller[ \t]
.-m
mulighed) til en …