У меня есть установка 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 `)'
Любой Идея, почему эта команда не работает?
Регулярное выражение здесь содержит одинарные кавычки, которые заканчивают строку в кавычках:
find ... '<(?:resource)...(?:"[^"]*"|\'[^\']*\'|[\w\-.:]+))?)*\s*/?>'
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^
Обратные слэши не не работают, чтобы экранировать что-либо в одинарных кавычках, поэтому отмеченные части заключаются в кавычки вещи вне их не. С помощью специальных символов оболочка запутывается. (Ну, я бы запутался, если бы попытался разобрать это вручную.)
Вы можете обойти это, по крайней мере, переключившись на двойные кавычки, чтобы обратные слеши могли использоваться для избежания двойных кавычек. внутри строки.
Другим способом было бы злоупотребление подстановкой команд и здесь-документов, которые должны иметь возможность обрабатывать кавычки без дальнейшего побега:
$ string=$(cat <<'EOF'
!"#%&/()[]{}'-.,*
EOF
)
$ echo "$string"
!"#%&/()[]{}'-.,*