grep: retorna NULL se falso

1

Estou tentando usar o grep para extrair atributos de uma grande coleção de arquivos XML. Eu tentei usar grep -E -m 1 -o -Z "<tag>(.*)</tag>" /home/somepath/*.xml || printf "NULL" , mas por algum motivo, ele não retorna NULL para um arquivo se o regex não corresponder. O objetivo aqui é criar um banco de dados SQL rudimentar desses arquivos, usando as informações das tags para preencher colunas. Esta é a minha primeira incursão em DBs, então talvez eu esteja fazendo tudo errado?

    
por StuporUser 12.11.2015 / 19:21

2 respostas

1

Se você quer algo por arquivo, você terá que usar um grep por arquivo, algo como:

$ find /home/somepath -type f -name '*.xml' | \
> while read path; do \
> grep -E -H -m 1 -o -Z "<tag>(.*)</tag>" "$path" || echo -e "$path\x00NULL"; \
> done

Quebrando:

$ find /home/somepath -type f -name '*.xml' -print | \

Isso gera a lista de arquivos para pesquisar e canaliza-os para o while . A única coisa que isso precisa fazer é imprimir um caminho por linha, então há muitas maneiras de fazer isso.

> while read path;do \

Isso lê cada linha na variável path shell e faz um loop até read retornar false , o que acontece quando atinge o fim do arquivo, o que ocorre quando find gerou todos os caminhos indo para.

> grep -E -H -m 1 -o -Z "<tag>(.*)</tag>" "$path" || echo -e "$path\x00NULL"; \

Isso pesquisa o arquivo atual (em $path ). Se o padrão não for encontrado no arquivo, grep retornará false (ou seja, sai com um código de saída diferente de zero), portanto, o echo é executado. O -e diz para interpretar os escapes, então o echo irá imprimir o caminho atual, um ASCII nul e o literal NULL . Isso é para emular a saída de grep , que será o caminho atual (forçado por -H , sendo grep normalmente não produzirá o caminho ao pesquisar um único arquivo), um ASCII nul (por causa do -Z ) e o texto correspondente.

> done

Fecha o loop while .

    
por 12.11.2015 / 21:55
0

Tente desta maneira:

grep -E -m 1 -o -Z "<tag>(.*)</tag>" /home/somepath/*.xml 2>&- || echo "NULL"
    
por 12.11.2015 / 19:24