Я пытаюсь использовать egrep с шаблоном регулярного выражения для соответствия пробелам.
Я раньше использовал RegEx с Perl и C#, и оба они поддерживают шаблон \s для поиска пробелов. egrep (или, по крайней мере, версия, которую я использую), похоже, не поддерживает этот шаблон.
В нескольких статьях в Интернете я встречал сокращение [[: space:]], но это, похоже, не работает. Любая помощь приветствуется.
Использование: SunOS 5.10





$ cat > file
this line has whitespace
thislinedoesnthave
$ egrep [[:space:]] file
this line has whitespace
Работает под debian.
В Solaris нет ли файла типа "eselect" (см. Gentoo) или альтернативного файла для установки вашей версии egrep по умолчанию?
Вы пробовали grep -E, потому что, если egrep, который находится на вашем пути, не подходит, возможно, grep.
Возможно, вам следует защитить шаблон кавычками (если bash или что-то подобное для оболочки, которую вы используете).
[и] могут иметь особое значение для оболочки.
Я вижу ту же проблему в 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
Я не понимаю, почему вы говорите, что у вас такая же проблема, похоже, она работает с egrep ..?
По умолчанию egrep не поддерживает расширенные наборы символов, такие как [[: space:]]. Вам нужно либо изменить свой PATH, либо указать абсолютный путь, как я сделал выше.
Какая это была версия egrep?
Если вы используете «деградированные» версии grep (я цитирую этот термин, потому что большинство UNIX, над которыми я работаю, по-прежнему используют оригинальные RE, а не причудливые с «\s» или «[[:space:]]» :-), вы можете просто вернуться к низшей форме RE.
Например, если :space: определен как пробелы и табуляции, просто используйте:
egrep '[ ^I]' file
Этот ^I является фактическим символом табуляции, а не двумя символами ^ и I.
Предполагается, что :space:является определен как табуляция и пробелы, в противном случае отрегулируйте выбор в пределах символов [].
Преимущество использования деградированных RE заключается в том, что они должны работать на всех платформах (по крайней мере, для ASCII; Unicode или неанглийские языки могут иметь разные правила, но я редко нахожу в этом необходимость).
Хорошее решение. Мне нравится идея работать с наименьшим общим знаменателем
[ \t]+, чтобы соответствовать одному или нескольким пробельным символам.
Если вы используете bash, то синтаксис для вставки табуляции в строку следующий:
$'foo\tbar'
Недавно я работал с sed, чтобы внести некоторые исправления в файл с разделителями табуляции. Часть файла была:
sed -E -e $'s/\t--QUOTE--/\t"/g'
Этот аргумент анализируется bash, и sed видит регулярное выражение с буквальными табуляциями.
Вы могли бы получить признание, если бы объяснили, где находится «здесь». Предположительно это был не Solaris 10. Или, если это был Solaris 10, то, вероятно, вы использовали не / usr / bin / egrep.