搜尋並替換為 find 和 xargs 不起作用

搜尋並替換為 find 和 xargs 不起作用

我正在嘗試搜尋並替換目標資料夾和子資料夾中 html/css 檔案原始程式碼中存在的 url。我嘗試使用以下命令:

find . -type f | xargs sed -i  's/https\:*\.websitedomain\.fr\///g'

我缺什麼?

預先感謝您的任何建議

答案1

假設一個 GNU 系統(您的使用情況sed -i顯示您就是這種情況):

eregex='https://[^/[:space:]]+\.websitedomain\.fr/'
find . -type f -exec grep -lZEe "$eregex" {} + |
  xargs -r0 sed -i -E "s|$eregex||g"

您的方法中存在的一些問題:

  • 主要的一個是正規*表示式運算子匹配0個或多個前一個原子,因此:*符合0個或多個:s。在這裡,我們將其替換為[^/[:space:]]+1 個或多個 ( +,一個擴展的正則表達式運算符,因此是-Es) 除空格之外的字符和/(.*這可能是您想要的最終可能匹配的字符)。google.com/ and foohttps://google.com/ and foo.websitedomain.fr/file
  • (每行一個檔案路徑)的輸出格式與(需要空白或換行符號分隔,可能引用的單字)find -print的預期輸入格式不相容。xargs的輸出格式find -print不能可靠地進行後處理,它只能用於人類消費。最好使用find ... -exec cmd {} +, 和/或使用 NUL 分隔的記錄xargs -r0(-r並且-0是 GNU 擴展)。
  • sed -i將文件替換為原始文件的修改副本,可能會丟失元數據信息,因此最好避免在不會修改的文件上運行,因此使用 或grep -lZ獲取列表(NUL 分隔,-Z以便可以由xargs -0至少有一行與正則表達式匹配的文件的 )使用。
  • :不是正規表示式運算符,因此不需要轉義。\:POSIX 未指定符合的內容,且在大多數實作sed中都沒有記錄。因此,雖然目前它可能:在您的實作中匹配 a sed,但將來可能會發生變化(例如\<\wwhile 最初匹配 on<w分別最終匹配較新版本中的單字邊界和單字字元)。
  • 如果您的命令中的正規表示式或替換sed包含sa /,則使用不同的字元作為分隔符號比必須使用/反斜線轉義更容易,這使得它很難閱讀。因此s|regexp|replacement|g這裡而不是s/regexp/replacement/g.我確實喜歡,|因為它可以使程式碼清晰易讀。它的缺點是它不能在ex/vi中使用s/regex/replacement/,但作為|分隔ex命令(它也是一個擴展的正則表達式運算符)。

答案2

嘗試這個:

find . -type f | xargs sed -i  's/test\.com/set\.com/g' 

如果您需要測試是否包含https然後試試這個:

find . -type f | xargs sed -i  's/https\:\\\\test\.com/https\:\\\\set\.com/g' 

注意*:這取代了測試網set.com

相關內容