Jak znaleźć spację w tekście. używasz grep?

13

Jak grepować jedną spację w tekście?

cat a.txt| grep ' '

lub

cat a.txt| grep '\s '
Emax
źródło
7
catW obu przypadkach nieuzasadnione użycie . Pierwszy można napisać grep ' ' a.txt, drugi podobnie zmienić.
MadHatter
1
Pamiętaj, że \spasuje również do tabulatorów, powrotu, tabulatorów pionowych, wysuwu formularza i technicznie do nowej linii. Jeśli chcesz dopasować tylko spację i tabulator, użyj [[:blank:]]lub [ \t].
Wstrzymano do odwołania.
używając gnu grep, możesz ograniczyć liczbę dopasowań ( -mopcja) do jednego ...
sendmoreinfo
To jest prostsze egrep "\ s" a.txt

Odpowiedzi:

6

Jeśli chcesz grepować tylko o jedną spację, zadając pytanie, możesz użyć czegoś takiego:

grep -e '^\s[^\s]' -e '[^\s]\s$' -e '[^\s]\s[^\s]' a.txt

lub dla wariantów POSIX:

grep -e '^ [^ ]' -e '[^ ] $' -e '[^ ] [^ ]' a.txt

lub mniej czytelny wariant POSIX:

grep '\(^\|[^ ]\)\ \([^ ]\|$)' a.txt

Zakładając, że chcesz wykluczyć wiersze zawierające więcej niż jedną sąsiednią spację, wymaga to jednoznacznie jednej spacji, nie poprzedzonej spacją i po niej spacji.

Warto również zauważyć, że nie wszystkie wersje grep obsługują kontrolę wyrażeń regularnych.


źródło
1
Możesz pominąć wszystkie ukośniki odwrotne z ostatniego przykładu i poprawić czytelność za pomocą -Eopcji określonej przez POSIX, która umożliwia rozszerzone wyrażenia regularne. grep -E '(^|[^ ]) ([^ ]|$)' a.txtW każdym razie odwrotny ukośnik przed spacją nie jest potrzebny i brakuje jednego przed ostatnim nawiasem zamykającym. Ponadto w przypadku wersji, grepktóre to rozumieją \s, możesz skrócić wyrażenie dla spacji [^\s]do\S
Wstrzymane do odwołania.
Jednak to też działa, [[: blank:]]
Emax
4

Myślę, że znalazłem to:

grep  "\+[[:space:]]\+" a.xml
Emax
źródło
1

Wariant 2 znajdzie tylko dwa pola. Jeśli użyjesz '\s'zamiast tego, oba warianty będą działać.

Możesz to łatwo przetestować samodzielnie, więc jakie jest twoje prawdziwe pytanie?

Sven
źródło
1
Dlaczego tylko dwie spacje? Myślę, że pasuje do każdej przestrzeni.
cuonglm
1
@Gnouc: Wariant 2 podczas wrotowania '\s 'dopasuje co najmniej dwa spacje z rzędu, ponieważ dodał grupę spacji za grupą postaci \s.
Sven
Masz rację, nie widzę miejsca później \s, mój błąd.
cuonglm