搜索并替换为 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

相关内容