使用sed命令配合正则表达式删除行时结果不符合预期问题咨询
问题1:反向引用未生效的原因
反向引用\1的作用是匹配和前序捕获组捕获到的完全相同的文本内容,而不是复用捕获组的匹配规则。你写的正则里([0-9][0-9])捕获到的是第一个数字段的具体值,比如B行第一个数字是35,那\1只能匹配35,不能匹配其他任意两位数。你的正则实际匹配的是「字母后跟着两个完全相同的两位数」的行,比如B 35 35才会被命中,你的测试样本里没有这类行,自然不会删除任何内容,达不到预期。
问题2:第二条命令的匹配问题
首先sed的d命令本身就是对所有匹配到的行执行删除,不存在“只删第一个匹配行”的逻辑,也不需要额外加全局标记:全局标记g仅适用于s///这类行内替换操作,对d命令完全无效,加了也不会生效。
你写的第二条正则/^[ABCD] ([0-9][0-9]) [0-9][0-9]$/逻辑是对的,匹配「只有字母+两个数字共三个字段」的行,正常执行会删除B、C两行,输出符合预期的A、D行。
如果确实出现只删除了一行的情况,大概率是你的输入文件存在隐藏格式问题:比如某行行尾有多余的空格、制表符,或者换行符不规范,导致该行不匹配$行尾规则。可以改成兼容行尾空白的版本验证:
sed -E '/^[ABCD] ([0-9]{2}) ([0-9]{2})[[:space:]]*$/d' text.txt
内容的提问来源于stack exchange,提问作者Ayoub_Prog
相关产品推荐
相关产品推荐

