Сложное регулярное выражение grep с неожиданным токеном

У меня есть установка Magento 2, где я пытаюсь найти любые синтаксически неправильные xml-файлы.

Я пытаюсь использовать следующую команду, чтобы найти любые файлы acl.xml в каталоге code, которые содержит узел с меткой resource, но отсутствует атрибут id.

Я успешно проверил этот код регулярного выражения на онлайн-тестировщике регулярных выражений:

<(?:resource)(?:\s+(?!id\b)[\w\-.:]+(?:\s*=\s*(?:"[^"]*"|\'[^\']*\'|[\w\-.:]+))?)*\s*/?>

Когда я пытаюсь использовать ниже, однако, я получаю сообщение об ошибке:

find app/code -type f -name "acl.xml" | xargs ack '<(?:resource)(?:\s+(?!id\b)[\w\-.:]+(?:\s*=\s*(?:"[^"]*"|\'[^\']*\'|[\w\-.:]+))?)*\s*/?>' -bash: syntax error near unexpected token `)'

Любая идея, почему эта команда не работает?

0
задан 1 December 2017 в 01:57

2 ответа

У монстра regexp есть одинарные кавычки, которые заканчиваются кавычкой:

find ... '<(?:resource)...(?:"[^"]*"|\'[^\']*\'|[\w\-.:]+))?)*\s*/?>' # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^

Обратные сляки не работают, чтобы избежать чего-либо в одинарных кавычках, поэтому отмеченные части цитируются, материал за пределами их нет. При наличии специальных символов оболочка путается. (Ну, я бы смутился, если бы попытался разобрать это вручную.)

Вы могли бы обойти это, по крайней мере, путем перехода на двойные кавычки, чтобы обратные косые черты могли использоваться для того, цитаты внутри строки.

Другим способом было бы злоупотреблять подстановкой команд и здесь-документами, которые должны иметь возможность обрабатывать кавычки без дальнейшего ускорения:

$ string=$(cat <<'EOF' !"#%&/()[]{}'-.,* EOF ) $ echo "$string" !"#%&/()[]{}'-.,*
0
ответ дан 18 July 2018 в 02:19

У монстра regexp есть одинарные кавычки, которые заканчиваются кавычкой:

find ... '<(?:resource)...(?:"[^"]*"|\'[^\']*\'|[\w\-.:]+))?)*\s*/?>' # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^

Обратные сляки не работают, чтобы избежать чего-либо в одинарных кавычках, поэтому отмеченные части цитируются, материал за пределами их нет. При наличии специальных символов оболочка путается. (Ну, я бы смутился, если бы попытался разобрать это вручную.)

Вы могли бы обойти это, по крайней мере, путем перехода на двойные кавычки, чтобы обратные косые черты могли использоваться для того, цитаты внутри строки.

Другим способом было бы злоупотреблять подстановкой команд и здесь-документами, которые должны иметь возможность обрабатывать кавычки без дальнейшего ускорения:

$ string=$(cat <<'EOF' !"#%&/()[]{}'-.,* EOF ) $ echo "$string" !"#%&/()[]{}'-.,*
0
ответ дан 24 July 2018 в 17:31

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

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