Bash正则表达式,从AT命令AT + COPS返回简短的字母数字运算符名称

问题描述 投票:1回答:3

我正在通过AT命令AT + COPS =使用bash脚本?它返回以下字符串:

+COPS: (1,"Orange F","Orange","20801",2),(1,"Swisscom","Swisscom","22801",7),(1,"Swisscom","Swisscom","22801",2),(1,"Salt","Salt","22803",2),(1,"Sunrise","Sunrise","22802",2),(1,"Sunrise","Sunrise","22802",7),(1,"Sunrise","Sunrise","22802",0),(2,"Salt","Salt","22803",7),(1,"Free","Free","20815",2),(1,"F SFR","SFR","20810",7),(1,"F-Bouygues Telecom","BYTEL","20820",7),,(0-4),(0-2)

并且我试图找到一个正则表达式来匹配每个简短的字母数字运算符名称。所以这里是:

Orange Swisscom Swisscom Salt Sunrise Sunrise Sunrise Salt Free SFR BYTEL

例如,在组中

(1,"F-Bouygues Telecom","BYTEL","20820",7)

这是有趣的“ BYTEL”部分。 “ BYTEL”也可以是小写字符和数字。

我尝试了多种解决方案,但它们都不都是100%匹配的。目前,我正在使用:

 grep -oP '"([a-zA-z])\w+"'

但是它在某些特殊情况下不起作用,并且也匹配长字母数字运算符名称(引号之间的名字)。

regex bash at-command
3个回答
0
投票

尝试此sed变体

sed 's/(/\n/g' file | sed -n 's/.,".*","\(.*\)",".*".*/\1/p'

您的测试字符串在文件中,输出

Orange
Swisscom
Swisscom
Salt
Sunrise
Sunrise
Sunrise
Salt
Free
SFR
BYTEL

0
投票

使用sed和awk的组合

sed 's/(/\n/g' file | awk -F, '{print gensub(/\"/,"","g", $3)}'

Orange
Swisscom
Swisscom
Salt
Sunrise
Sunrise
Sunrise
Salt
Free
SFR
BYTEL

0
投票

这是一种令人讨厌的格式。我想出了

fugly command |
grep -o '([^()]*)' |
awk -F , 'NF==5 { x=$3; gsub(/\"/, "", x); print x }'

在某种意义上是不令人满意的,但是我希望它很容易理解。

演示:https://ideone.com/jH0NKj

这是一个简化的纯Awk变体,假设稍有不同:

awk -F , -v RS='(' 'NF>=5 { x=$3; gsub(/\"/, "", x); print x}'

演示:https://ideone.com/UvEXXH

© www.soinside.com 2019 - 2024. All rights reserved.