Почему я должен процитировать сбежавший персонаж в регулярном выражении для GreeP, но не на двигателях онлайн Regex?

Вы можете сделать это с помощью расширенной опции glob, которая позволит вам расширять подстановочные знаки внутри переменной с помощью*()

shopt -s extglob
dir_array=(
    "/srv/*(*)/folderA"
    "/srv/level1D/*(*)/folderA"
)

Расширение произойдет в для d in... , что, я думаю, является правильным моментом.

11
30.04.2020, 07:27
3 ответа

Превращение комментариев в ответ:

Проблема в том, что \является escape-символом как для регулярных выражений, так и для оболочки. \.относится к оболочке так же, как '.'. echoи set -xпомогают понять, что делает оболочка:

> echo \.
.

> echo '\.'
\.

> echo \\.
\.


> set -x
> echo 9_00 | grep 9\.00
+ echo 9_00
+ grep 9.00
9_00

Таким образом, если команда должна видеть \, она должна быть защищена кавычками или вторым \.

9
28.04.2021, 23:17

Чтобы добавить к другому ответу и комментариям, еще одна вещь, которую вы можете сделать, чтобы заставить grepвернуть то, что вы хотите, это использовать следующее:

grep -F 9.00 small.txt

Выход:

9.00

-Fзаставляет grepвидеть шаблон как фиксированную строку, а не как регулярное выражение, так что он будет возвращать только строки с этой точной строкой. Из-за этого вам даже не нужно экранировать .или использовать кавычки, потому что он будет точно соответствовать только 9.00вместо того, чтобы видеть .как любой символ.

2
28.04.2021, 23:17

Why do I have to quote an escaped character in a regular expression for grep, but not on online regex engines?

Вы не должны заключать его в кавычки для grep , но для оболочки.

Использование grep -fдля чтения шаблона из файла показывает, что шаблон 9\.00, который вы показали, работает нормально, если он не проходит через оболочку.

$ cat re.txt 
9\.00
$ grep -f re.txt small.txt 
9.00

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

I know that there are differences between engines at the advanced level

Даже не обязательно слишком продвинутый. Что-то вроде +уже работает по-разному в BRE и ERE. Также, по крайней мере, некоторые онлайн-инструменты по умолчанию используют регулярные выражения Perl или аналогичные, которые имеют много функций, отсутствующих в стандартных регулярных выражениях.

См.:

1
28.04.2021, 23:17

Теги

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