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是与字符串相对应的变量