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"
!"#%&/()[]{}'-.,*
Другие вопросы по тегам