Comexp regex grep com token inesperado

0

Eu tenho uma instalação do Magento 2 onde estou tentando encontrar qualquer arquivo xml sintaticamente correto.

Estou tentando usar o comando abaixo para encontrar qualquer arquivo acl.xml no code dir que contenha um nó rotulado resource , mas sem um atributo id .

Eu testei esse código regex em um testador de regex on-line com êxito:

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

Quando tento usar o comando abaixo, recebo um erro:

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 ')'

Alguma idéia de por que esse comando não está funcionando?

    
por Peter A 30.11.2017 / 07:42

1 resposta

0

O monstro regexp contém aspas simples, que terminam a string citada:

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

As barras invertidas não funcionam para escapar de algo entre aspas simples, por isso as partes marcadas são citadas, o material fora delas não é. Com os caracteres especiais lá, o shell fica confuso. (Bem, eu ficaria confuso se tentasse analisar isso à mão.)

Você poderia contornar isso, pelo menos alterando aspas duplas, para que as barras invertidas pudessem ser usadas para escapar das aspas duplas dentro da string.

Outra forma seria abusar da substituição de comandos e dos documentos aqui, que devem ser capazes de lidar com aspas sem escapar:

$ string=$(cat <<'EOF'
!"#%&/()[]{}'-.,*
EOF
)
$ echo "$string"
!"#%&/()[]{}'-.,*
    
por ilkkachu 30.11.2017 / 23:14