正如您在下面的脚本示例中看到的,我试图在具有该 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://主机名/。