我正在嘗試搜尋並替換目標資料夾和子資料夾中 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 個或多個 (+
,一個擴展的正則表達式運算符,因此是-E
s) 除空格之外的字符和/
(.*
這可能是您想要的最終可能匹配的字符)。google.com/ and foo
https://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
中都沒有記錄。因此,雖然目前它可能:
在您的實作中匹配 ased
,但將來可能會發生變化(例如\<
或\w
while 最初匹配 on<
並w
分別最終匹配較新版本中的單字邊界和單字字元)。- 如果您的命令中的正規表示式或替換
sed
包含s
a/
,則使用不同的字元作為分隔符號比必須使用/
反斜線轉義更容易,這使得它很難閱讀。因此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