Только цифры sh и grep

Я сталкиваюсь с проблемой и пытаюсь найти решение, которое работает в sh . Если бы я мог использовать bash, этот код работал бы:

ls /a|grep ^[0-9] 

К сожалению, это не так с sh, и да, мне нужно использовать sh. 🙂 Запуск в sh я получаю

 ls /a |grep ^[0-9] [0-9]: not found Usage: grep -hblcnsviw pattern file . . . 

Если я удалю ^ код работает, но мне нужны только файлы, которые начинаются с чисел, а не те, которые содержат числа. Например, мне нужны файлы, которые:

 12.00.2 2.222.1234.12 

из страницы grep man я должен использовать ^ .

В настоящее время моя реализация была выполнена с использованием:

 ls /a|grep -v [az]|grep -v [AZ] 

Поскольку это удалит все файлы, содержащие символы, но все же, если файл будет .123.33, он появится.

4 Solutions collect form web for “Только цифры sh и grep”

Что-то вроде этого должно работать на вас:

 ls /a | egrep "^[0-9]" 

По обратной ссылке @Anthons egrep устарел, поэтому вы можете использовать -E как переключатель для нормальной команды grep :

 ls /a | grep -E "^[0-9]" 

По словам Перфана, расширенные регулярные выражения (ERE) даже не нужны в этой ситуации. Действительно, имеет значение цитирование ^[0-9] чтобы защитить его от интерпретации какой-либо версией /bin/sh которую вы используете, что связано с проблемой. Итак, что-то вроде этого было бы самым простым решением вашей проблемы:

 ls /a | grep "^[0-9]" 

-или-

 ls /a | grep '^[0-9]' 

Кстати, я думаю, что вы ссылаетесь на оболочку Bourne, которая была оболочкой большинства систем Unix до середины 90-х годов и была /bin/sh на Solaris до Solaris 11.

В Solaris 10 и старше не используйте /bin/sh . Эта оболочка из другой эпохи. Вместо этого используйте /usr/xpg4/bin/sh .

В оболочке Бурна ^ является псевдонимом для | для совместимости со своей предшественницей оболочки Thompson. Итак, ваша команда похожа:

 ls /a|grep |[0-9] 

И оболочка Bourne сообщает, что не может найти команду с именем [0-9] а grep жалуется на отсутствие каких-либо аргументов.

Даже если вы используете стандартный sh в отличие от оболочки Bourne, я бы рекомендовал вам указать ^ . Например, ^ является оператором globbing в zsh когда опция extendedglob включена.

В любом случае, если не ^ , вы должны указать [0-9] поскольку это операторы глобирования. [0-9] будет расширяться оболочкой в ​​список файлов в текущем каталоге, имя которого равно одной цифре.

Так:

 ls /a | grep '^[0-9]' 

Кстати, в оболочке Борна

 ls /a ^ grep '^[0-9]' 

также будет работать.

Для этого вам не нужны ls и grep ; вы можете использовать простой glob /a/[0-9]* :

 echo /a/[0-9]* ls /a/[0-9]* grep foo /a/[0-9]* 

Если вы используете это в скрипте, будьте осторожны, что синтаксический вывод ls – плохая идея .

Я согласен с l0b0 grep – плохая идея здесь, но в любом случае, вот объяснение проблемы и обходной путь. В Solaris 10 и старше, /bin/sh – устаревшая оболочка, которую нельзя использовать ни для чего, кроме запуска устаревших скриптов. Вы действительно должны использовать ksh , bash или /usr/xpg4/bin/sh .

Исходная причина здесь – это исходный способ указать канал в ранние Unix-времена. Solaris /bin/sh унаследовал эту археологическую функцию.

Обходной путь тогда довольно прост, просто избегайте каретки одним из следующих способов:

 ls /a |grep \^[0-9] 

или

 ls /a |grep "^[0-9]" 

или

 ls /a |grep '^[0-9]' 
  • Невозможно смонтировать разделы / разделы, не распознанные в Solaris 11.1
  • Nexenta (Solaris), странное членство пользователей в LDAP
  • Почему `host` и` nslookup` в Solaris 10 разрешают имена хостов, в то время как `ping` и` telnet` нет?
  • Спецификация Solaris ps aux comand. Почему для grep необходимо использовать параметр ww?
  • Добавить пользователя в Solaris
  • Копирование только различий?
  • Генерация случайных чисел в Solaris?
  • Команда Solaris для остановки прослушивания в порту
  • Как получить файл на хост, когда все, что у вас есть, это последовательная консоль?
  • команда expr, используемая для работы и остановки
  • Настройка интерфейса для получения адреса через dhcp Solaris
  • Linux и Unix - лучшая ОС в мире.