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.