Изменил ли grep способ использования регулярных выражений?

Я использовал для запуска таких команд, как: find / dev | grep sd * для вывода списка всех дисков, подключенных к моему компьютеру. Похоже, что теперь мне нужно добавить любой случайный символ перед звездой, чтобы получить такой же эффект, как показано ниже:

sudo find /dev | grep sdp*

I проверил это на разных серверах Ubuntu 12.04 и получил тот же эффект, так что я не думаю, что это что-то случайное на моем рабочем столе. Это новое изменение, ошибка или это всегда было так, и моя память нуждается в замене?

3
задан 20 November 2013 в 18:40

1 ответ

У вас есть две проблемы:

  • Глобализация мешает вашему регулярному выражению
  • Ваше регулярное выражение не соответствует тому, что должно соответствовать

Раскрытие механизма globbing

sudo find /dev | grep sd* работает не так, как раньше, потому что у вас есть файл или папка в вашем текущем рабочем каталоге, который вызывает глобализацию от bash. Добавьте echo перед вашей командой, чтобы увидеть, как глобализация делает с вашей командой

echo grep sd*

Добавляя случайный дополнительный символ, глобализация больше не соответствует файлу / папке, и grep продолжает работать как ожидается.

Как предотвратить сбои

Чтобы предотвратить слипание, вы должны поставить '...' на срок. (Двойные кавычки также будут работать.) Это заставит grep вести себя как прежде:

sudo find /dev | grep 'sd*'

Как работают регулярные выражения

Теперь, когда регулярное выражение работает, как и ожидалось, давайте Посмотрите, что * означает в регулярных выражениях, а не в глобальных файлах. Короче говоря, это означает «Этот последний символ ноль или n-раз», и это, скорее всего, не то, что вы хотите. Используя 'sd*', вы можете увидеть /dev/stdout на выходе, так как stdout начинается с s, за которым следует ноль или больше d.

В вашем случае все просто:

sudo find /dev | grep sd

должно быть все, что вам нужно.


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

find /dev -name 'sd*'
ls -1 /dev/sd*
0
ответ дан 20 November 2013 в 18:40

Другие вопросы по тегам:

Похожие вопросы: