如何使用sed正则匹配小写字母后紧跟同字符大写的字符串
问题根因
你之前写的sed命令无法生效,是因为\U是sed替换操作(s///命令)中才支持的大小写转换转义符,在正则匹配规则里\U不会被解析为“匹配对应大写字母”的语义,只会被识别为普通转义字符甚至字面量U,自然无法命中目标字符串。
匹配规则回顾
需要命中的字符串满足:存在至少一处「小写字母后紧跟同一字母的大写形式」的字符对,比如oO、bB这类序列。
- 符合规则的示例:
foObar:包含oO序列foobBar:包含bB序列
- 不符合规则的示例:
fOobar:小写f后是大写O,不属于同字母大小写配对,其余位置也无符合要求的序列foobbar:所有相邻字符均为小写,无对应大写字母紧跟的情况
正确sed实现方案
sed原生正则不支持在匹配阶段直接将捕获的小写字母转换为大写做匹配,最通用、兼容所有sed版本(GNU sed、BSD sed等)的方案是直接枚举所有26组同字母大小写配对,写入正则分支匹配即可:
# 通用可移植写法 sed -nE '/aA|bB|cC|dD|eE|fF|gG|hH|iI|jJ|kK|lL|mM|nN|oO|pP|qQ|rR|sS|tT|uU|vV|wW|xX|yY|zZ/p'
效果验证
执行测试命令可得到符合预期的结果:
# 测试匹配foObar,正常输出foObar sed -nE '/aA|bB|cC|dD|eE|fF|gG|hH|iI|jJ|kK|lL|mM|nN|oO|pP|qQ|rR|sS|tT|uU|vV|wW|xX|yY|zZ/p' <<<foObar # 测试匹配foobBar,正常输出foobBar sed -nE '/aA|bB|cC|dD|eE|fF|gG|hH|iI|jJ|kK|lL|mM|nN|oO|pP|qQ|rR|sS|tT|uU|vV|wW|xX|yY|zZ/p' <<<foobBar # 测试不匹配fOobar,无输出 sed -nE '/aA|bB|cC|dD|eE|fF|gG|hH|iI|jJ|kK|lL|mM|nN|oO|pP|qQ|rR|sS|tT|uU|vV|wW|xX|yY|zZ/p' <<<fOobar # 测试不匹配foobbar,无输出 sed -nE '/aA|bB|cC|dD|eE|fF|gG|hH|iI|jJ|kK|lL|mM|nN|oO|pP|qQ|rR|sS|tT|uU|vV|wW|xX|yY|zZ/p' <<<foobbar
如果觉得手写26组配对太繁琐,在GNU sed环境下可以借助shell命令自动生成匹配模式,效果和手写完全一致:
# GNU环境简化写法,自动生成26组大小写配对的正则 sed -nE "/$(awk 'BEGIN{for(i=97;i<=122;i++) printf "%c%c|",i,i-32}' | sed 's/|$//')/p"
内容的提问来源于stack exchange,提问作者Joshro
相关产品推荐
相关产品推荐

