我正在尝试搜索并替换目标文件夹和子文件夹中 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