Cum să grep un spațiu în text?
cat a.txt| grep " "
sau
cat a.txt| grep "\s "
Comentarii
Răspuns
Dacă doriți să grep pentru doar un spațiu așa cum ați pus în întrebarea dvs., ați folosi ceva de genul:
grep -e "^\s[^\s]" -e "[^\s]\s$" -e "[^\s]\s[^\s]" a.txt
sau pentru variantele POSIX:
grep -e "^ [^ ]" -e "[^ ] $" -e "[^ ] [^ ]" a.txt
sau varianta POSIX mai puțin lizibilă:
grep "\(^\|[^ ]\)\ \([^ ]\|$)" a.txt
Presupunând că doriți să excludeți liniile care conțin mai mult de un spațiu adiacent , acest lucru necesită în mod explicit să existe un spațiu, nu precedat de un spațiu și nu urmat de un spațiu.
De asemenea, merită menționat faptul că nu toate versiunile grep acceptă controale de expresie regulată „\ s”.
Comentarii
- Puteți omite toate acele bare oblice din ultimul exemplu și puteți îmbunătăți lizibilitatea utilizând opțiunea
-E
specificată POSIX, care permite regexuri extinse. > În orice caz, backslash-ul din fața spațiului nu este necesar ' și este nevoie de ' înainte de paranteze finală de închidere. De asemenea, pentru versiunilegrep
care înțeleg\s
, puteți scurta expresia pentru non-spațiu[^\s]
la\S
- Totuși, și acest lucru funcționează, [[: blank:]]
Răspuns
Cred că l-am găsit:
grep "\+[[:space:]]\+" a.xml
Răspuns
Varianta 2 va găsi doar două spații. Dacă utilizați "\s"
în schimb, ambele variante vor funcționa.
Puteți testa acest lucru cu ușurință, deci care este întrebarea dvs. actuală?
Comentarii
- De ce să găsești doar două spații? Cred că se potrivește cu orice spațiu.
- @Gnouc: Varianta 2 pe măsură ce o scrie
'\s '
se va potrivi cu cel puțin două spații la rând, deoarece a adăugat un spațiu caracter după grupul de caractere\s
. - Ai ' dreptate, nu ' nu vezi spațiul după
\s
, greșeala mea.
cat
în ambele cazuri. Primul ar putea fi scrisgrep ' ' a.txt
, al doilea modificat în mod similar.\s
se potrivește și cu fila, returnează, filă verticală, feed formular și, tehnic, linie nouă. Dacă doriți să potriviți doar spațiul și fila, utilizați[[:blank:]]
sau[ \t]
.-m
) la una …