如何用sed/grep/正则删除链接中第n次(4/5次)斜杠后的内容?
解决方法:用sed或awk截断超链接至第n次斜杠
问题分析
你尝试的grep命令未生效,原因是正则表达式包含了.*$,导致grep -o输出整个匹配的行(和原内容一致),且无法处理斜杠数量不足的情况。
方案1:使用sed命令
要保留第5次斜杠(含)之前的内容,同时斜杠少于4个时保留完整链接,可以用以下sed命令:
sed -E 's/^(([^\/]*\/){5}).*/\1/' text.txt
解释:
-E:启用扩展正则表达式,避免多余转义^(([^\/]*\/){5}):匹配开头的5组「非斜杠字符+斜杠」的内容,对应到第5次斜杠结束的位置.*:匹配第5次斜杠后的所有内容\1:替换为前面捕获的第5次斜杠前的部分- 对于斜杠数量不足5的行,正则不匹配,
sed会直接输出原行,满足额外要求
测试示例输入:
输入:
https://www.forbes.com/forbes/welcome/?toURL=https://forbes.com/&refURL=&referrer= https://example.com https://a/b/c
输出:
https://www.forbes.com/forbes/welcome/ https://example.com https://a/b/c
方案2:使用awk命令
如果觉得正则逻辑不好理解,awk通过分割字段的方式更直观:
awk -F '/' '{if (NF >= 6) {printf "%s/%s/%s/%s/%s/\n", $1, $2, $3, $4, $5} else {print $0}}' text.txt
解释:
-F '/':用斜杠作为字段分隔符NF:当前行的字段总数,NF >=6意味着斜杠数量≥5(字段数=斜杠数+1)- 当字段数足够时,拼接前5个字段并加上结尾的斜杠;否则输出原行
调整n值(如第4次斜杠)
如果需要保留到第4次斜杠,只需修改命令中的数字:
- sed命令:将
{5}改为{4} - awk命令:将
NF >=6改为NF >=5,拼接前4个字段:printf "%s/%s/%s/%s/\n", $1, $2, $3, $4
内容的提问来源于stack exchange,提问作者Muhammad Yaseen
相关产品推荐
相关产品推荐

