如何用Sed删除dnsmasq黑名单文件中的不符合规则行
完善后的Sed命令及说明
直接使用这条命令即可满足需求:
sed '/^address=\/[[:alnum:]][[:alnum:].-]*\/#$/!d'
原命令的问题
你之前的命令'\|^address=/[[:alnum:]]|!d;\|/#$|!d'存在明显漏洞:它仅检查了行首起始格式和行尾结束格式,但完全没有限制中间的字符内容。只要行首是address=/加字母数字、行尾是/#,哪怕中间包含&、额外的/等非法字符,都会被错误保留。
新命令的正则规则拆解
这条命令通过单条完整正则严格匹配整个行,确保只有符合要求的行被保留:
^address=\/:强制匹配行首的address=/(\/是转义的斜杠,避免和Sed的分隔符冲突)[[:alnum:]]:要求address=/后必须紧跟一个字母/数字,直接排除address=/.com/#这类以符号开头的无效行[[:alnum:].-]*:允许中间出现任意数量的字母、数字、.、-(-放在字符集最后,避免被解析为范围符)\/#$:强制匹配行尾的/#,排除address=/test.com/1.1.1.1这类结尾不是/#的行!d:删除所有不符合上述完整正则的行
验证效果
- 符合规则将被保留的行:
address=/test.com/#、address=/test-123.example/# - 会被过滤的行:
address=/.com/#、address=/test.com/1.1.1.1、address=/test/&.com/#
内容的提问来源于stack exchange,提问作者Wizballs
相关产品推荐
相关产品推荐

