Как найти пробел в тексте. используя grep?


13

Как получить один пробел в тексте?

cat a.txt| grep ' '

или

cat a.txt| grep '\s '

7
Бесплатное использование catв обоих случаях. Первое можно было написать grep ' ' a.txt, второе изменили аналогичным образом.
MadHatter

1
Обратите внимание, что \sтакже соответствует табуляция, возврат, вертикальная табуляция, подача формы и, технически, новая строка. Если вы хотите использовать только пробел и табуляцию, используйте [[:blank:]]или [ \t].
Приостановлено до дальнейшего уведомления.

используя GNU grep, вы можете ограничить количество совпадений ( -mопция) до одного ...
sendmoreinfo

Это более простой egrep "\ s" a.txt

Ответы:


6

Если вы хотите использовать grep только для одного пробела в вопросе, вы должны использовать что-то вроде:

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

или для вариантов POSIX:

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

или менее читаемый вариант POSIX:

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

Предполагая, что вы хотите исключить строки, которые содержат более одного соседнего пробела, это явно требует наличия одного пробела, без пробела и без пробела.

Также стоит отметить, что не все версии grep поддерживают элементы управления регулярными выражениями.


1
Вы можете опустить все эти обратные слэши из последнего примера и улучшить читаемость, используя -Eопцию, указанную в POSIX, которая включает расширенные регулярные выражения. grep -E '(^|[^ ]) ([^ ]|$)' a.txtВ любом случае, обратная косая черта перед пробелом не нужна, а перед последней закрывающей скобкой отсутствует одна. Кроме того, для версий, grepкоторые понимают \s, вы можете сократить выражение для без пробелов [^\s]до\S
Пауза до дальнейшего уведомления.

Однако это тоже работает, [[: blank:]]
Emax


1

Вариант 2 найдет только два пробела. Если вы используете '\s'вместо этого, оба варианта будут работать.

Вы можете легко проверить это сами, так какой у вас вопрос?


1
Почему только два пробела? Я думаю, что это соответствует любому месту.
Cuonglm

1
@Gnouc: Вариант 2, когда он пишет, '\s 'будет соответствовать как минимум двум пробелам подряд, потому что он добавил пробел после группы персонажей \s.
Свен

Вы правы, я не вижу места после \s, моя ошибка.
Cuonglm
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.