我的目录结构中有很多文件。我想使用正则表达式从这些文件中提取一些字符串(即网址)。
我试过这个:
find . -path "*alder/ * / * .html" -print | xargs sed -n "/http:\/\/[^'\"]*/p" > urls.txt
...但它没有按预期工作。这find
部分工作正常,那xargs
一个,还好,但那sed
一个,不行。我在 urls.txt 中得到的只是所有文件的串联。
答案1
使用相同的find
命令,这将返回与正则表达式匹配的 URL:
find . -path "*alder/ * / * .html" -exec grep -oh "http://[^'\"]*" {} +
与此不同的是find...-print | xargs command...
,此方法适用于名称包含空格或其他困难字符的文件。
选项-o
告诉grep
它只返回匹配的部分,而不是匹配所在的行。 -h
告诉它忽略打印从中找到匹配项的文件名。
OP中的命令find
仅匹配名称中路径中有空格的文件。因为我怀疑这不是您想要的,所以这里是该命令的另一种形式,它可以查找当前目录的子目录下任意深度的名称以 结尾的find
所有文件:.html
alder
find *alder/ -name '*.html' -exec grep -oh "http://[^'\"]*" {} +
更稳健的方法
为了防止其他类型的坏html
文件,cas 建议使用空格或>
表示 URL 的结尾,并接受https
以及http
:
find . -path "*alder/ * / * .html" -exec grep -oEh "https?://[^'\"[:space:]>]*" {} +
答案2
感谢您的快速解答。对于路径中的额外空格感到抱歉,但是删除它们会使路径在尝试在此处发布时变得奇怪。
我想使用 sed 来处理 grep,在处理超过 1.2 GB、25,000 个文件时,速度真的非常慢。
我找到了答案。第一个 sed 命令用 "'= chars 来分割文件,然后第二个 sed 命令打印这些行。如下所示:
寻找 。 -path "*alder.com/ * / * .html" -print| xargs sed -r "s/[\"'=]/\n/g"| sed -n "/^http\s?:/p" > urls.txt