Я не эксперт в ударе, и я испытываю затруднения отфильтровать корректную подстроку.
Я имею
echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,"
это заканчивается как
AT^SYSCFGEX=\"0201\",3fffffff,2,4,7fffffffffffffff,,
Как я могу добраться 0201
как результат? Я борюсь с этим.
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
– получите содержание первой группы, сохраненной преждеВот альтернативное использование grep
в PCRE-режиме (-P
) с regex lookarounds, показывая только части соответствия каждой строки (-o
):
grep -Po '(?<=\\")\d+(?=\\")'
Это соответствует всем числам, которые включаются в оставленные из обратной косой черты двойные кавычки, как \"0201\"
, но не возвращая кавычки в результате.
(?<=\\")
lookbehind, который соответствует пустой строке, если этому предшествует внутренняя структура (\"
). \d+
соответствия одна или несколько цифр. (?=\\")
предвидение, которое соответствует пустой строке, если это сопровождается внутренней структурой (\"
). Пример:
$ echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,," | grep -Po '(?<=\\")\d+(?=\\")'
0201
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
с сопоставлением с образцом \"*
(т.е. все от \"
) разделенный от конца.Вот 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