Матч Grep Regex не дает ожидаемого результата

У меня есть несколько серверов Ubuntu, и есть поведение, которое вызывает у меня любопытство.

На любом недавно установленном компьютере (Ubuntu Server 12.04.3 LTS), если я запускаю:

echo "testbla123" | grep -P -o [0-9]*

Это вернет 123, как и ожидалось.

На более старой машине (Ubuntu Server 12.04.1 LTS), если я запускаю ту же команду, я ничего не получаю, вместо этого мне нужно выполнить:

echo "testbla123" | grep -P -o "[0-9]*"

После выполнения apt-get upgrade, он будет работать без кавычек вокруг регулярного выражения.

Grep имеет одинаковые версии на обеих машинах. Я пытался сравнить зависимости до и после обновления в течение некоторого времени без особой удачи.

Мне было интересно, кто-нибудь знает, почему это происходит?

2
задан 22 August 2013 в 15:22

1 ответ

Скорее всего, у вас есть файл, который соответствует шаблону глобуса [0-9]* на вашем втором компьютере, а не на первом. Если это так, оболочка расширит глобус до имени файла перед передачей его в качестве аргумента grep.

Если в текущем каталоге нет файла, который соответствует, оболочка оставляет шаблон глобуса нетронутым и передает его как есть команде.

$ echo abc123 | grep -P -o [0-9]*
123
$ touch 234
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 234
$ touch 123
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 123 234
$ rm 234 123
$ touch 12
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 12
12
$ 

Всегда заключайте в кавычки параметры, содержащие подстановочные знаки оболочки, если вы не хотите, чтобы они расширялись оболочкой.

0
ответ дан 22 August 2013 в 15:22

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

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