Hvordan tar jeg tak i ett mellomrom i tekst?

cat a.txt| grep " " 

eller

cat a.txt| grep "\s " 

Kommentarer

  • Nødvendig bruk av cat i begge tilfeller. Den første kunne skrives grep ' ' a.txt, den andre ble endret på samme måte.
  • Merk at \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].
  • ved å bruke gnu grep, kan du begrense antall treff (-m -alternativet) til en …
  • Dette er mer enkelt, egrep " \ s " a.txt

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 av grep 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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *