如何在多個文件中使用 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

相關內容