Egrep поиск пробелов

Я пытаюсь использовать egrep с шаблоном регулярного выражения, чтобы соответствовать пробелу.

Я использовал RegEx с Perl и С# раньше, и они оба поддерживают шаблон \s для поиска пробелов. egrep (или, по крайней мере, версия, которую я использую), похоже, не поддерживает этот шаблон.

В нескольких статьях онлайн я столкнулся с сокращением [[: space:]], но это, похоже, не работает. Любая помощь приветствуется.

Использование: SunOS 5.10

Ответы

Ответ 1

Я вижу ту же проблему в SunOS 5.10. /usr/bin/egrep не поддерживает расширенные регулярные выражения.

Попробуйте использовать /usr/xpg4/bin/egrep:

$ echo 'this line has whitespace
thislinedoesnthave' | /usr/xpg4/bin/egrep '[[:space:]]'
this line has whitespace

Другим вариантом может быть просто использование perl:

$ echo 'this line has whitespace
thislinedoesnthave' | perl -ne 'chomp;print "$_\n" if /[[:space:]]/'
this line has whitespace

Ответ 2

Если вы используете "деградированные" версии grep (я цитирую этот термин, потому что большинство UNIX'ов, над которыми я работаю, по-прежнему используют оригинальные REs, а не те из них, которые имеют "\s" или "[[:space:]]": -), вы можете просто вернуться к самой низкой форме RE.

Например, если :space: определяется как пробелы и вкладки, просто используйте:

egrep '[ ^I]' file

То, что ^I является фактическим символом табуляции, а не двумя символами ^ и I.

Предполагается, что :space: есть, определяемый как вкладки и пробелы, в противном случае отрегулируйте выбор внутри символов [].

Преимущество использования ухудшенных RE заключается в том, что они должны работать на всех платформах (по крайней мере для ASCII, Unicode или неанглийские языки могут иметь разные правила, но я редко нахожу необходимость).

Ответ 3

Если вы используете bash, тогда синтаксис для размещения вкладки в строке

$'foo\tbar'

Недавно я работал с sed, чтобы сделать некоторые исправления в файле с разделителями табуляции. Часть файла:

sed -E -e $'s/\t--QUOTE--/\t"/g'

Этот аргумент анализируется с помощью bash, а sed видит регулярное выражение с литеральными вкладками.

Ответ 4

Возможно, вы должны защитить шаблон кавычками (если bash или что-то эквивалентное для используемой оболочки).

[и] может иметь особое значение для оболочки.

Ответ 5

$ cat > file
this line has whitespace
thislinedoesnthave
$ egrep [[:space:]] file 
this line has whitespace

Работает под debian.

Что касается Solaris, не существует ли "eselect" (см. gentoo) или альтернативный файл для установки вашей версии egrep по умолчанию?

Вы пробовали grep -E, потому что если egrep, который находится на вашем пути, не является хорошим, может быть, grep.