Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在bash中解析变量的某些字节_Regex_Bash - Fatal编程技术网

Regex 在bash中解析变量的某些字节

Regex 在bash中解析变量的某些字节,regex,bash,Regex,Bash,我有一个包含以下字符串的变量(其中每个点代表一个不可打印的字符): 这是十六进制: ESC [ ? 1 h ESC = CR 8 1 CR LF 1b 5b 3f 31 68 1b 3d 0d 38 31 0d 0a 我想要的是隔离“81”。数字81可以更改,例如它可以是100,然后在字符串中使用3个字节,但数字始终在两个“0x0d”之间 因此,目标是将两个“0x0d”之间的所有字节(在ascii中始终是数字)隔离开来,并将它们保存为另

我有一个包含以下字符串的变量(其中每个点代表一个不可打印的字符):

这是十六进制:

ESC [   ?   1   h   ESC  =   CR  8   1   CR  LF
1b  5b  3f  31  68  1b   3d  0d  38  31  0d  0a
我想要的是隔离“81”。数字81可以更改,例如它可以是100,然后在字符串中使用3个字节,但数字始终在两个“0x0d”之间

因此,目标是将两个“0x0d”之间的所有字节(在ascii中始终是数字)隔离开来,并将它们保存为另一个变量中的整数


仅使用bash就可以做到这一点吗?是否可以使用正则表达式?

一个简单的正则表达式将捕获所需的十六进制十进制字符,如下所示:

0[dD](\s*3(\d))*\s*0[dD]
sed -n "s/^.*\x0d(\d)(\d)?(\d)?\x0d.*$/\1\2\3/"
第2组捕获十进制值,即十六进制值-30,因此只有第二个字符。 不幸的是,只有最后一组被抓获。如果您可以将自己限制在一定数量的最大小数位数,您可以简单地复制术语,如中所示

0[dD](\s*3(\d))(\s*3(\d))?(\s*3(\d))?\s*0[dD]
并用

\2\4\6
以获取十进制值

编辑

如果您的输入不是十六进制,而是一个普通的字符串,它将如下所示

\x0d(\d)*\x0d
或手动重复(此处为3x):

以相同的替换模式

\1\2\3
Edit2

在sed中,其工作原理如下:

0[dD](\s*3(\d))*\s*0[dD]
sed -n "s/^.*\x0d(\d)(\d)?(\d)?\x0d.*$/\1\2\3/"

现在使用开始和结束填充
^.*匹配器。*$
,以及替换模式
s/search/replace/
您可以这样做:

a=$'\033[?1h\033=\r81\r\n' # or a=$'\x1b[?1h\x1b=\r81\r\n'

[[ $a =~ $'\r'([0-9]+)$'\r' ]] && echo ${BASH_REMATCH[1]} 

$“…”
将解释字符串中的转义序列,如
\r
\n
、八进制表示法
\033
或十六进制表示法
\x1b

,那么您想要38和31?另外,
不是
0d
。更正我想要81,它当前是字符串“0x38 0x31”,并希望将其保存为另一个变量中的整数。81不是常量值,可以更改,但位置始终在两个“0x0d”之间。字符串中的其他元素是否会更改?还有,这个数字是在两个点之间,还是两个或更多的数字之间?如果你告诉我会发生什么变化,我可以给你写正则表达式。这是可能发生的,但我想要的数字(在本例中是81)总是在两个0x0dIsn之间,而不是字符串的十六进制值,比如“2e5b3f31682e3d2e38312e2e2e2e0d0a”,你如何将其转换为十六进制?我尝试了“echo”$output2“\sed-n”\x0d(\d)(\d)?(\d)?\x0d)?\x0d“”,控制台显示“sed:-e expression#1,char 22:unterminated address regex”output2是与字符串相对应的变量