Estou procurando todas as ocorrências de <source_model>.*</source_model>
qualquer arquivo localizado em ./vendor/magento/*/etc/adminhtml/system.xml
:
find ./vendor/magento/ -type f -path */etc/adminhtml/system.xml -exec grep -P "<source_model>.*</source_model>" {} +
Mas a saída está na forma de:
./vendor/magento/module-authorizenet-cardinal/etc/adminhtml/system.xml: <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
E quero extrair o valor:
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
<source_model>Magento\Captcha\Model\Config\Mode</source_model>
...
Então eu posso resolver isso. Como posso fazer isso?
O comportamento padrão de
grep
quando são fornecidos vários arquivos para pesquisar é anexar o nome do arquivo a cada linha de saída. Então você está vendo esta saída porque está usando-exec ... +
o qual tenta iniciar o menor número de instâncias possível agrupando os arquivos, em vez de-exec ... \;
executar o comando para cada arquivo separadamente. Então, você tem algumas opções (observe as aspas em torno do-path
valor, isso é importante, caso contrário ele*
será expandido pelo shell antes defind
vê-lo):Usar
-exec \;
Se você estiver usando GNU
grep
, o padrão em sistemas Linux, você pode usar o-h
sinalizador para suprimir a impressão dos nomes dos arquivosÉ claro que, para tudo isso, se você estiver usando uma
grep
implementação que suporte isso, provavelmente também desejará o-o
sinalizador, portantogrep
imprimirá apenas a parte correspondente da linha.