Как получить режим модема с помощью sed или awk от модемного вывода?

Я не эксперт в ударе, и я испытываю затруднения отфильтровать корректную подстроку.

Я имею

echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,"

это заканчивается как

AT^SYSCFGEX=\"0201\",3fffffff,2,4,7fffffffffffffff,,

Как я могу добраться 0201 как результат? Я борюсь с этим.

3
задан 23 July 2018 в 03:45

4 ответа

С sed

sed -r 's/[^0-9]*([0-9]+).*/\1/'

извлекает первое число из строки.

Пример выполняется

$ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | sed -r 's/[^0-9]*([0-9]+).*/\1/'
0201

Объяснения

  • -r – используйте расширенные регулярные выражения
  • s/a/b/ – замена a b
  • [^0-9]* – захватите все кроме цифры, здесь она соответствует AT^SYSCFGEX=\"
  • ([0-9]+) – захватите по крайней мере одну цифру и сохраните ее в группе, здесь она соответствует 0201
  • .* – захватите целый отдых строки, здесь это соответствует \",3fffffff,2,4,7fffffffffffffff,,
  • \1 – получите содержание первой группы, сохраненной прежде
4
ответ дан 1 December 2019 в 13:08

Вот альтернативное использование grep в PCRE-режиме (-P) с regex lookarounds, показывая только части соответствия каждой строки (-o):

grep -Po '(?<=\\")\d+(?=\\")'

Это соответствует всем числам, которые включаются в оставленные из обратной косой черты двойные кавычки, как \"0201\", но не возвращая кавычки в результате.

  • (?<=\\") lookbehind, который соответствует пустой строке, если этому предшествует внутренняя структура (\").
  • \d+ соответствия одна или несколько цифр.
  • (?=\\") предвидение, которое соответствует пустой строке, если это сопровождается внутренней структурой (\").

Пример:

$ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | grep -Po '(?<=\\")\d+(?=\\")'
0201
3
ответ дан 1 December 2019 в 13:08

С bashрасширение параметра

Если Вы хотите использовать просто bash можно сделать это как это:

$ var="AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,"
$ echo ${var#*\"}
0201\",3fffffff,2,4,7fffffffffffffff,,
$ var=${var#*\"}
$ echo ${var%%\\\"*}
0201

Объяснения

  • ${var#*\"} – расширяется до содержания переменной var с сопоставлением с образцом *" (т.е. все до ") разделенный с начала
  • ${var%%\\\"*} – расширяется до содержания переменной var с сопоставлением с образцом \"* (т.е. все от \") разделенный от конца.

Дальнейшее чтение

2
ответ дан 1 December 2019 в 13:08

Вот awk подход. Идея здесь - это awk (или быть точным, GNU awk ) может использовать несколько символов в качестве разделителей. Таким образом мы можем использовать \ и " как разделители, для извлечения желаемой строки с:

awk -F '[\\\\"]' '{print $3}'

Отметьте несколько \ , которые необходимы, чтобы выйти из обратной косой черты и избежать его интерпретируемый оболочкой как Escape для следующего символа.

С echo команда в вопросе,

$ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | awk -F '[\\\\"]' '{print $3}'
0201

С другой стороны, мы могли просто использовать " как разделитель и отключенный последнее \ через substr() функция:

$ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | awk -F '"' '{print substr($2,1,length($2)-1)}'
0201
1
ответ дан 1 December 2019 в 13:08

Другие вопросы по тегам:

Похожие вопросы: