求助:使用sed/grep从乱序字符串中提取^12=后的目标内容
解决方案
方法一:使用grep(PCRE模式)
利用正则的零宽断言匹配目标内容,同时覆盖12=lmn在字符串开头、中间、结尾的所有场景:
# 匹配任意位置的12=lmn echo "abcde^10=fgi^11=jkl^12=lmn" | grep -oP '(?<=^12=|\^12=)[^^]+' echo "abcde^11=jkl^12=lmn^10=fgi" | grep -oP '(?<=^12=|\^12=)[^^]+' echo "12=lmn^11=jkl^10=fgi^abcde" | grep -oP '(?<=^12=|\^12=)[^^]+'
- 解释:
(?<=^12=|\^12=)匹配12=开头(字符串起始位置)或^12=开头的前置位置;[^^]+匹配后续所有非^的字符,精准提取目标值。
方法二:使用sed命令
通过全局替换过滤掉无关内容,仅保留目标字段:
echo "abcde^10=fgi^11=jkl^12=lmn" | sed -E 's/.*(^12=|\^12=)([^^]+).*/\2/'
- 解释:
.*匹配所有前置无关内容;(^12=|\^12=)定位目标字段的前缀;([^^]+)捕获目标值;最后用\2替换整行,输出捕获的目标内容。
方法三:使用awk命令
以^为分隔符遍历字段,匹配并提取目标值:
echo "12=lmn^11=jkl^10=fgi^abcde" | awk -F'^' '{for(i=1;i<=NF;i++){if($i~/^12=/){print substr($i,4)}}}'
- 解释:
-F'^'将字符串按^分割为多个字段;循环遍历字段,找到以12=开头的字段后,从第4位开始截取(跳过12=)并输出。
你之前命令的问题说明
你使用的[^)]*是错误的——目标分隔符是^而非),同时未考虑12=lmn位于字符串结尾(无后续^)的场景,导致部分情况匹配失败。
内容的提问来源于stack exchange,提问作者Achow
相关产品推荐
相关产品推荐

