如何用grep -Po提取字符串指定分段(AWK方案已可行)
使用grep -Po提取指定模式的字符串
需求
需要从一组字符串(或目录文件名)中,提取从开头到第一个连字符(-)后一位的内容,按前缀分组后保留唯一值。例如从ACCEPT组提取ACCEPT-z、ACCEPT-1,从BASIC_REGIS组提取BASIC_REGIS-2、BASIC_REGIS-P,要求用grep -Po(Perl正则、仅匹配)实现。
输入示例
ACCEPT-zABC-0123 ACCEPT-zBAC-0231 ACCEPT-1ABC-0120 ACCEPT-1CBA-0321 BASIC_REGIS-2ABC-9043 BASIC_REGIS-2CBA-8132 BASIC_REGIS-PCCA-6532 BASIC_REGIS-PBBC-3023
期望输出
ACCEPT-z ACCEPT-1 BASIC_REGIS-2 BASIC_REGIS-P
当前错误的grep尝试
执行以下命令:
echo "ACCEPT-0ABC-0123"|grep -Po "\K^A.*-"
得到结果:ACCEPT-0ABC-,不符合需求(需要ACCEPT-0)。
可行的AWK方案
执行以下命令可得到正确结果:
echo "ACCEPT-1ABC-0120"|awk '$0 ~ /^A/{print substr($0,1,index($0,"-")+1)}'
输出:ACCEPT-1
正确的grep -Po解决方案
使用以下命令(结合sort -u去重):
grep -Po '^[^-]+-.` input.txt | sort -u
正则说明
^:锚定字符串起始位置[^-]+:匹配任意非连字符的字符,直到第一个-出现(对应ACCEPT或BASIC_REGIS前缀)-:匹配第一个连字符.:匹配连字符后的任意单个字符(支持数字、字母等任意类型)
执行后会从输入中提取所有符合模式的内容,再通过sort -u去重,最终得到与期望一致的输出。
内容的提问来源于stack exchange,提问作者syed laeeq
相关产品推荐
相关产品推荐

