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