我不是 bash 专家,我在过滤出正确的子字符串时遇到了麻烦。
我有
echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,"
结果为
AT^SYSCFGEX=\"0201\",3fffffff,2,4,7fffffffffffffff,,
我怎样才能得到0201
结果?我正在为此苦苦挣扎。
我不是 bash 专家,我在过滤出正确的子字符串时遇到了麻烦。
我有
echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,"
结果为
AT^SYSCFGEX=\"0201\",3fffffff,2,4,7fffffffffffffff,,
我怎样才能得到0201
结果?我正在为此苦苦挣扎。
和
sed
从字符串中提取第一个数字。
示例运行
解释
-r
– 使用扩展的正则表达式s/a/b/
– 替换a
为b
[^0-9]*
- 抓取除数字之外的所有内容,这里匹配AT^SYSCFGEX=\"
([0-9]+)
- 抓住至少一个数字并将其保存在一个组中,这里匹配0201
.*
– 抓住整条线的其余部分,在这里匹配\",3fffffff,2,4,7fffffffffffffff,,
\1
- 获取之前保存的第一组的内容grep
这是在 PCRE 模式 ( ) 中使用正则表达式环视的替代方法-P
,仅显示每行 (-o
) 的匹配部分:这匹配包含在反斜杠转义双引号中的所有数字,例如
\"0201\"
,但不返回结果中的引号。(?<=\\")
是一个lookbehind,它匹配一个空字符串,如果它前面有内部模式(\"
)。\d+
匹配一位或多位数字。(?=\\")
是一个前瞻,如果它后跟内部模式 (\"
),则匹配一个空字符串。例子:
With
bash
的参数展开如果你想使用 just
bash
你可以这样做:解释
${var#*\"}
– 扩展到变量的内容,var
模式匹配*"
(即直到 的所有内容"
)从一开始就被剥离${var%%\\\"*}
– 扩展到变量的内容,var
模式匹配\"*
(即来自 的所有内容\"
)从末尾剥离。进一步阅读
man bash
/EXPANSION/参数扩展这是一种
awk
方法。这里的想法是awk
(或者准确地说,GNUawk
)可以使用多个字符作为分隔符。因此,我们可以使用\
and"
作为分隔符来提取所需的字符串:注意 multiple
\
,它是转义反斜杠所必需的,并避免它被 shell 解释为下一个字符的转义。使用
echo
问题中的命令,或者,我们可以只使用
"
分隔符并切断最后一个\
viasubstr()
函数: