Como imprimir linhas usando localizar e sed em vários arquivos?

0

Eu tenho muitos arquivos em uma estrutura de diretórios. Eu quero extrair alguma string (ou seja, urls) usando um regexp, a partir desses arquivos.

Eu tentei isso:

find . -path "*alder/ * / * .html" -print | xargs sed -n "/http:\/\/[^'\"]*/p" > urls.txt

... mas não funciona como esperado. A parte find funciona ok, o xargs um, ok mas o sed um, não. Tudo o que eu obtenho no urls.txt é a concatenação de todos os arquivos.

    
por user175093 14.06.2016 / 23:14

2 respostas

1

Usando seu mesmo comando find , isso retornará as URLs que correspondem à regex:

find . -path "*alder/ * / * .html"  -exec grep -oh "http://[^'\"]*" {} +

Ao contrário de find...-print | xargs command... , essa abordagem funcionará em arquivos cujos nomes contenham espaços em branco ou outros caracteres difíceis

A opção -o para grep diz para retornar somente a parte correspondente, não a linha na qual a correspondência está. -h diz para omitir a impressão dos nomes dos arquivos a partir dos quais as correspondências foram encontradas.

O comando find no OP corresponde apenas aos arquivos cujos nomes possuem espaços no caminho. Como suspeito que isso não é o que você deseja, aqui está uma forma alternativa do comando find que encontra todos os arquivos .html em qualquer profundidade nos subdiretórios do diretório atual cujos nomes terminam em alder :

find *alder/ -name '*.html' -exec grep -oh "http://[^'\"]*" {} +

Abordagem mais robusta

Para proteger-se contra outros tipos de arquivos html ruins, a cas sugere que o espaço em branco ou > também sinalizem o final de um URL e também aceitem https , bem como http :

find . -path "*alder/ * / * .html"  -exec grep -oEh "https?://[^'\"[:space:]>]*" {} +
    
por 14.06.2016 / 23:48
0

Obrigado por todas as respostas rápidas. Desculpe pelos espaços extras no caminho, mas removê-los transforma o caminho em algo estranho ao tentar postar aqui.

Eu queria usar sed para o grep é muito, muito lento em mais de 1,2 gB, 25.000 arquivos.

Eu encontrei uma resposta. Um primeiro comando sed para cortar os arquivos com "'= chars e, em seguida, um segundo comando sed para imprimir as linhas. Aqui está:

encontre. -path "* alder.com / * / * .html" -print | xargs sed -r "s / [\" '=] / \ n / g "| sed -n" / ^ http \ s?: / p "> urls.txt

    
por 15.06.2016 / 01:11

Tags