grep не может найти экранированную черту, которая раньше работала

У меня есть конкретные строки, за которыми следует либо тире '-', вертикальная черта '|' или цифра

8-летний код всегда фильтровал данные с помощью [-\|0-9]

этот grep теперь терпит неудачу

> cat regex
^abc[\-\|0-9]
> echo abc- | grep -v -f regex
abc-

Работает нормально при удалении обратной косой черты

> cat regex
^abc[-\|0-9]
> echo abc- | grep -v -f regex
>

Обратная косая черта отлично работает в командной строке!

> echo abc- | grep -v ^abc[\-\|0-9]
>

Так как это работает непосредственно в командной строке, может показаться, что "-f" загружает файл в программу?

Я проверил это поведение на GNU grep 2.20 (на CentOS7) и GNU grep 2.5.1 (на CentOS5)

Очевидное решение - просто убрать обратную косую черту. Каждое указание из моих поисков говорит, что обратный слеш должен быть разрешен.

Мне бы очень хотелось понять, почему он начал давать сбой... но отлично работает в командной строке. У меня больше нет доступа к старым Linux-блокам для тестирования.

1 ответ

Решение

Если это сработало, возможно, это ошибка. В POSIX BRE обратная косая черта в выражениях ранжирования не является особенной:

<backslash> должны быть особенными, за исключением случаев, когда они используются в выражении в скобках

Кроме того, поскольку ваш диапазон регулярных выражений фактически означает "все символы между \ а также \, плюс трубы и цифры ", возможно, вы использовали локаль, которая - эквивалентно \ в порядке сопоставления. Я не смог воспроизвести это с какими-либо локалями в моих системах.

но отлично работает в командной строке

Это не так. Поскольку вы не цитируете строку, оболочка удаляет обратную косую черту. Вот что grep заканчивает тем, что видит:

$ printf '%s\n' ^abc[\-\|0-9]
^abc[-|0-9]
Другие вопросы по тегам