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]