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

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

Tenho muitos arquivos em uma estrutura de diretórios. Quero extrair alguma string (ou seja, URLs) usando um regexp desses arquivos.

Eu tentei isso:

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

... mas não funciona como esperado. A findparte funciona ok, xargsaquela, ok, mas aquela sed, não. Tudo o que consigo em urls.txt é a concatenação de todos os arquivos.

Responder1

Usando o mesmo findcomando, isso retornará os URLs que correspondem ao regex:

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

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

A -oopção grepdiz para retornar apenas a parte correspondente, não a linha em que a correspondência está. -hdiz para omitir a impressão dos nomes dos arquivos nos quais as correspondências foram encontradas.

O findcomando no OP corresponde apenas a arquivos cujos nomes possuem espaços no caminho. Como suspeito que não é isso que você deseja, aqui está uma forma alternativa do findcomando que encontra todos .htmlos arquivos 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 se proteger contra outros tipos de htmlarquivos inválidos, cas sugere deixar espaços em branco ou >também sinalizar o final de um URL e também httpsaceitar http:

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

Responder2

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

Eu queria usar sed para 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á:

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

informação relacionada