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 find
parte funciona ok, xargs
aquela, ok, mas aquela sed
, não. Tudo o que consigo em urls.txt é a concatenação de todos os arquivos.
Responder1
Usando o mesmo find
comando, 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 -o
opção grep
diz para retornar apenas a parte correspondente, não a linha em que a correspondência está. -h
diz para omitir a impressão dos nomes dos arquivos nos quais as correspondências foram encontradas.
O find
comando 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 find
comando que encontra todos .html
os 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 html
arquivos inválidos, cas sugere deixar espaços em branco ou >
também sinalizar o final de um URL e também https
aceitar 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