Jak grepować jedną spację w tekście?
cat a.txt| grep " "
lub
cat a.txt| grep "\s "
Komentarze
Odpowiedź
Jeśli chcesz grep tylko dla jednej spacji, tak jak w swoim pytaniu, użyłbyś 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ę , to wyraźnie wymaga, aby istniała jedna spacja, nie poprzedzona spacją ani po niej spacja.
Warto również zauważyć, że nie wszystkie wersje programu grep obsługują elementy sterujące wyrażeniami regularnymi „\ s”.
Komentarze
- Możesz pominąć wszystkie odwrotne ukośniki z ostatniego przykładu i poprawić czytelność, używając określonej w standardzie POSIX opcji
-E
, która włącza rozszerzone wyrażenia regularne.grep -E '(^|[^ ]) ([^ ]|$)' a.txt
W każdym razie ukośnik odwrotny przed spacją nie jest ' potrzebny, a ' brakuje przed ostatnim nawiasem zamykającym. w przypadku wersjigrep
, które rozumieją\s
, możesz skrócić wyrażenie, aby nie było spacji[^\s]
do\S
- Jednak to też działa, [[: blank:]]
Odpowiedź
Myślę, że znalazłem to:
grep "\+[[:space:]]\+" a.xml
Odpowiedź
Wariant 2 spowoduje znalezienie tylko dwóch spacji. Jeśli użyjesz "\s"
zamiast tego oba warianty będą działać.
Możesz to łatwo przetestować samodzielnie, więc jakie jest twoje rzeczywiste pytanie?
Komentarze
- Dlaczego znaleźć tylko dwie spacje? Myślę, że pasuje do dowolnej spacji.
- @Gnouc: Wariant 2, gdy pisze,
'\s '
będzie pasował do co najmniej dwóch spacji z rzędu, ponieważ dodał spację znak po grupie znaków\s
. - Masz ' rację, ja nie ' nie widzę spacji po
\s
, mój błąd.
cat
w obu przypadkach. Pierwsza mogłaby zostać zapisanagrep ' ' a.txt
, druga zmieniona podobnie.\s
pasuje również do tab, return, tabulator pionowy, format strony i technicznie nowa linia. Jeśli chcesz dopasować tylko spację i tabulator, użyj[[:blank:]]
lub[ \t]
.-m
) do jednego …