如何用Perl/Sed/Awk替换Bash变量$text中的所有URL为“URL”
实现方法(无需分别处理HTTP/HTTPS)
不用单独针对http://和https://编写规则,通过正则表达式https?://即可同时匹配两种协议(s?表示s字符可选),再配合匹配URL剩余部分的规则就能完成批量替换。
1. 纯Bash参数展开(无需外部工具)
直接利用Bash内置的参数替换功能,无需调用额外工具:
text="blah blah blah https://www.stackoverflow.com blah http://example.com test" text=${text//https?:\/\/[^[:space:]]+/URL} echo "$text"
说明:[^[:space:]]+用于匹配URL中直到下一个空格的所有字符,确保只替换完整的URL片段。
2. Sed命令
通过sed的扩展正则匹配两种协议,完成全局替换:
text="blah blah blah https://www.stackoverflow.com blah http://example.com test" text=$(echo "$text" | sed -E 's/https?:\/\/[^[:space:]]+/URL/g') echo "$text"
说明:-E启用扩展正则语法,g标志表示替换所有匹配项(而非仅第一个)。
3. Perl命令
Perl的正则处理更简洁,用\S+匹配非空白字符组成的URL部分:
text="blah blah blah https://www.stackoverflow.com blah http://example.com test" text=$(echo "$text" | perl -pe 's/https?:\/\/\S+/URL/g') echo "$text"
说明:\S+等价于[^[:space:]]+,写法更紧凑,同样能匹配到URL的结束位置。
4. Awk命令
通过遍历文本字段,匹配并替换符合条件的URL:
text="blah blah blah https://www.stackoverflow.com blah http://example.com test" text=$(echo "$text" | awk '{for(i=1;i<=NF;i++) if($i~/^https?:\/\//) $i="URL"}1') echo "$text"
说明:遍历每个字段,判断是否以http://或https://开头,是则替换为URL,最后1表示输出处理后的整行内容。
内容的提问来源于stack exchange,提问作者Sebastien Willemijns
相关产品推荐
相关产品推荐

