Я использую скрипт 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)

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

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

Но он не будет работать в некоторых особых случаях и соответствует также длинным буквенно-цифровым именам операторов (имя между кавычками).

1
Carton_ 18 Фев 2020 в 16:48

3 ответа

Лучший ответ

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

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

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

Orange
Swisscom
Swisscom
Salt
Sunrise
Sunrise
Sunrise
Salt
Free
SFR
BYTEL
0
Ivan 18 Фев 2020 в 14:33

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

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

0
tripleee 18 Фев 2020 в 15:05

Используя комбинацию 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
Fredrik Pihl 18 Фев 2020 в 14:56