Bash регулярное выражение, которое возвращает короткое буквенное имя c имя оператора из AT-команды AT + COPS - PullRequest
1 голос
/ 18 февраля 2020

Я использую сценарий bash с AT-командой AT + COPS =? который возвращает следующую строку:

+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)

И я пытаюсь найти регулярное выражение, соответствующее каждому короткому альфанумерим c именам операторов. Так вот, это:

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+"'

, но он не будет работать в некоторых особых случаях и соответствует также длинным именам операторов alphanumeri c (имя между кавычками).

Ответы [ 3 ]

0 голосов
/ 18 февраля 2020

Попробуйте этот вариант sed

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

Ваша тестовая строка находится в файле, вывод

Orange
Swisscom
Swisscom
Salt
Sunrise
Sunrise
Sunrise
Salt
Free
SFR
BYTEL
0 голосов
/ 18 февраля 2020

с использованием комбинации 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 голосов
/ 18 февраля 2020

Это надоедливый формат для разбора. Я придумал

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

...