Hvordan grep et mellemrum i tekst?

cat a.txt| grep " " 

eller

cat a.txt| grep "\s " 

Kommentarer

  • Utilsigtelig anvendelse af cat i begge tilfælde. Den første kunne skrives grep ' ' a.txt, den anden blev ændret på samme måde.
  • Bemærk at \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].
  • ved hjælp af gnu grep, kan du begrænse antallet af matches (-m mulighed) til en …
  • Dette er mere simpelt egrep " \ s " a.txt

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 af grep, 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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *