如何在多个文件中使用 sed 就地替换将一个 url 替换为另一个 url?

如何在多个文件中使用 sed 就地替换将一个 url 替换为另一个 url?

正如您在下面的脚本示例中看到的,我试图在具有该 URL 模式的所有文件中查找并替换(就地替换)一个 URL 的一部分字符串,将其替换为另一个字符串(url 部分)。

换句话说,所有包含“https://主机名/必须找到',然后找到字符串'https://主机名/' 必须在整个文件中替换为 'https://主机名.fq.dn/

到目前为止我整理了以下内容:

grep -L -R -e 'https://hostname/' /srv/www/htdocs/intranet/data/pages/ | grep '.txt$' | xargs -n1 sed -i.bak 's|https://hostname/|https://hostname.fq.dn/|'

我猜想 sed 正则表达式中肯定存在错误。我搜索和阅读了几个小时,仍然没有找到问题所在。备份文件由 sed 创建,但文件中似乎没有替换任何内容。

有什么建议吗?比如我如何调试我在 sed 中使用的正则表达式?我很迷茫,甚至还没有在 stackexchange/serverfault 上找到类似的东西。

答案1

天哪!我太笨了。我终于在这里找到了错误。正则表达式很好,工作正常。grep 选项“-L”完全是垃圾。它应该是“-l”,只返回匹配的路径和文件名。

grep -l -R -e 'https://hostname/' /srv/www/htdocs/intranet/data/pages/*.txt | xargs -n1 sed -i.bak 's|https://hostname/|https://hostname.fq.dn/|'

呃!抱歉给您带来麻烦。

答案2

我建议在一个选定的文件上进行调试:

sed 's|something|replacement|g' a_file.txt

看看会发生什么。

当你的正则表达式被调试时,你可以像这样简化你的命令:

shopt -s globstar
sed -i.bak 's|https://hostname/|https://hostname.fq.dn|g' /srv/www/htdocs/intranet/data/pages/{,**/}*.txt

不需要 grep 和 xargs。

您提供的正则表达式对我而言适用于仅包含以下内容的测试文件https://主机名/

相关内容