如何使用Grep命令匹配首尾为下划线且中间可含下划线的字符串
用Grep匹配首尾下划线包裹的字符串
针对你需要匹配**首尾均为下划线、中间可包含任意字符(包括下划线)**的字符串,同时排除开头/结尾缺失下划线的情况,我推荐用GNU Grep的Perl兼容正则(PCRE)功能来实现精准匹配,下面是具体方案:
核心命令
grep -oP '(?<!_)_.*_(?!_)' your_file.txt
详细解释
-o:只输出匹配到的目标子串,而不是整行内容,这样能直接提取你需要的符合规则的字符串。-P:开启PCRE模式,支持反向/正向预查这类高级正则特性,这是实现精准匹配的关键。(?<!_):反向否定预查,确保我们要匹配的起始下划线_前面没有其他下划线——避免把长串的一部分(比如_abc_def_里的abc_def_)误判为有效匹配。_.*_:核心匹配规则,匹配以_开头、_结尾的任意长度字符串,中间可以包含任何字符(包括下划线),完全满足你例子里的_ADFADF_ASFDSAFD_AFDSADF_这类场景。(?!_):正向否定预查,确保匹配的结尾下划线_后面没有其他下划线,同样避免截断长串的情况。
测试验证
假设你有这样的测试文本:
SetODBCServerOverride.port=_CLIENT_ODBC_TUNNEL_PORT_ ASDFASDF_ASFDASDF_AFSDASFD _ASDFASDF_ASDFASDF_ASDFAS ASDFASD_ASDFSADF_ASFDASD_ _ADFADF_ASFDSAFD_AFDSADF_
执行上面的命令后,输出结果会是:
_CLIENT_ODBC_TUNNEL_PORT_ _ADFADF_ASFDSAFD_AFDSADF_
完全命中你需要保留的目标字符串,同时自动排除了所有不符合规则的条目。
无PCRE环境的替代方案
如果你的系统不支持PCRE(比如一些老旧版本的Grep),可以用扩展正则模式(-E)配合sed来处理:
grep -oE '(^|[^_])_.*_([^_]|$)' your_file.txt | sed 's/^[^_]*//; s/[^_]*$//'
这里grep会匹配带前后非下划线字符的目标串,再通过sed去掉多余的前缀和后缀,最终得到纯净的符合规则的字符串。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

