我的目錄結構中有很多檔案。我想使用正規表示式從這些文件中提取一些字串(即網址)。
我試過這個:
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