首页 > 解决方案 > 如何使用 sed 替换 http 或 https?

问题描述

我的以下字符串中有以下字符串.htaccess

https://www.example.com/index.php?language=french 
RewriteCond %{HTTP_HOST} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

这是我的预期输出:

https://altwww.example.com/index.php?language=french 
RewriteCond %{HTTP_HOST} ^altwww.example.com [NC]
RewriteRule ^(.*)$ http://altwww.example.com/$1 [L,R=301]

我尝试了以下方法:

old_domain="https?:\/\/www"
new_domain="https?:\/\/altwww"
sed -i -e "s/\${old_domain}/${new_domain}/g" /path/to/my/.htaccess

标签: regexbashsed

解决方案


您可以使用

old_domain='(https?:\/\/)(https?:\/\/)?www'
new_domain='\1altwww'
old_domain2='(\^)(altwww\.)?([[:alnum:]][^ ]*\.com)'
new_domain2='\1altwww.\3'

sed -i -E "s/${old_domain}/${new_domain}/g;s/${old_domain2}/${new_domain2}/g" /path/to/my/.htaccess

-E选项启用 POSIX ERE 语法。

(https?:\/\/)(https?:\/\/)?www模式匹配并捕获到第 1 组http://orhttps://中,然后再次匹配可选的http://or https://(以避免重复),然后匹配www。替换 ,\1altwww用第 1 组的内容替换匹配项www并附加到它上面。

第二个命令查找一个^(捕获到第 1 组)后跟一个可选altwww.字符串(第 2 组),然后有一个字母数字字符、零个或多个非空格字符,然后.com捕获到第 3 组(使用(\^)(altwww\.)?([[:alnum:]][^ ]*\.com))并替换为第 1 组值 + altwww.+ 第 3 组值。

请参阅在线演示


推荐阅读