如何在多个文件中使用 find 和 sed 打印行?

如何在多个文件中使用 find 和 sed 打印行?

我的目录结构中有很多文件。我想使用正则表达式从这些文件中提取一些字符串(即网址)。

我试过这个:

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所有文件:.htmlalder

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

相关内容