Комплексное регулярное выражение 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 в 00:57

1 ответ

Регулярное выражение здесь содержит одинарные кавычки, которые заканчивают строку в кавычках:

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

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

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

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

$ string=$(cat <<'EOF'
!"#%&/()[]{}'-.,*
EOF
)
$ echo "$string"
!"#%&/()[]{}'-.,*
0
ответ дан 1 December 2017 в 00:57

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

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