GREP + REGEX работает не так, как я ожидал

Наконец-то мне удалось снова запустить системный плагин на всех USB-устройствах. Я думаю, что это был тот момент, потому что я попробовал несколько thig :переустановить grub, проверить основной раздел и т. д. Спасибо всем, кто нашел время, чтобы помочь. Спасибо.

8
20.01.2020, 13:21
3 ответа

Это регулярное выражение кажется слишком сложным. Кроме того, вы должны использовать цитирование!

$ ls /dev | grep -E "tty[1-4]$"
tty1
tty2
tty3
tty4

Тем не менее, вы обязательно должны прочитать это:Почему *не *parse `ls`(и что делать вместо этого )?

7
27.01.2020, 20:08
bash-4.2$ ls -l /dev | grep -o "tty[1-4]$"
tty1
tty2
tty3
tty4


bash-4.2$ ls -l /dev | awk '/tty[1-4]$/{print $NF}'
tty1
tty2
tty3
tty4

bash-4.2$ output=$(ls /dev); echo "${output}" | grep "tty[1-4]$"
tty1
tty2
tty3
tty4
-1
27.01.2020, 20:08

Причина несоответствия заключается в том, что вы ищете пробел(\s)перед строкой ttyи в конце совпадения. Это никогда не происходит здесь, так как lsбудет печатать одну запись в строке. Обратите внимание, что lsне совпадает с ls | command. Когда вывод lsпередается по конвейеру, это активирует опцию -1, заставляя lsпечатать только одну запись в строке. Это будет работать, как и ожидалось, если вы просто удалите эти\s:

ls /dev | grep -E '([tty]+[0-4])'

Однако это также будет соответствовать всем вещам, которые вам не нужны. Это регулярное выражение совсем не то, что вам нужно. [ ]составляют класс символов . Выражение [tty]+эквивалентно [ty]+и будет соответствовать одному или нескольким tили y. Это означает, что он будет соответствовать t, или tttttttttttttttt, или tytytytytytytytytyt, или любой другой комбинации одной или обеих этих букв. Кроме того, круглые скобки здесь бессмысленны, они создают группу захвата , но вы ее не используете. То, что вы хотите, это:

$ ls /dev | grep '^tty[0-4]$'
tty0
tty1
tty2
tty3
tty4

Обратите внимание, как я добавил туда $. Таким образом, выражение соответствует только tty, а затем одному числу, одному из 1, 2, 3 или 4 до конца строки($).

Конечно, безопасный способ сделать это, избегающий всех опасностей синтаксического анализа ls, заключается в использовании вместо этого подстановок:

$ ls /dev/tty[0-4]
/dev/tty0  /dev/tty1  /dev/tty2  /dev/tty3  /dev/tty4

или просто

$ echo /dev/tty[0-4]
/dev/tty0 /dev/tty1 /dev/tty2 /dev/tty3 /dev/tty4
31
27.01.2020, 20:08

Теги

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