首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash脚本-如何从4字节十六进制值中只匹配1字节?

Bash脚本-如何从4字节十六进制值中只匹配1字节?
EN

Stack Overflow用户
提问于 2016-08-25 17:26:31
回答 3查看 436关注 0票数 0

我试图从我得到的4字节(32位)十六进制输出中只过滤一个字节(在xx -小endian之后的小字节2和3)。当我执行命令时,我得到以下输出

代码语言:javascript
复制
000023xx

xx是变化的而不是固定的。

我正在尝试编写一个bash脚本,以查看我得到的输出是否与23匹配。当我使用以下内容时,它与23xx匹配,其中xx在2-3之间,但我希望只匹配xx后面的23 (小endian)。

示例

代码语言:javascript
复制
val=231a
echo $val | grep -o -E '[2-3]+' | head -1 | sed -e 's/^0\+//'
23

val=2332
echo $val | grep -o -E '[2-3]+' | head -1 | sed -e 's/^0\+//'
2332

在第二个例子中,我想要一个23的输出。

EN

回答 3

Stack Overflow用户

发布于 2016-08-25 17:42:15

您可以单独使用bash完成这一任务;不需要其他工具。

代码语言:javascript
复制
val=231a
if [[ $val = *23?? ]]; then
    echo "$val matches"
else
    echo "$val doesn't match"
fi
票数 2
EN

Stack Overflow用户

发布于 2016-08-25 18:47:36

您可以在算术展开中执行和(&)和右移(>>):

代码语言:javascript
复制
(( ((val >> 8) & 0xFF) == 0x23 )) && echo "value is 23"

只是要小心括号!并将十六进制值前缀为0x

代码语言:javascript
复制
val=0x231a

该守则的意思是:

  • 删除最后8位(>> 8),
  • 删除最后8位以上的任何其他位(& 0xFF),以及
  • 将结果与十六进制23 (== 0x23)进行比较。

如果结果是true,执行:echo "value is 23"

如果该值实际上是“小endian",那么字符串0000231a中的十六进制值是:

代码语言:javascript
复制
val=0x1a230000

守则将是:

代码语言:javascript
复制
(( ((val >> 16) & 0xFF) == 0x23 )) && echo "value is 23"

如果val中的字符串为val=0000231a,则只需执行以下操作:

代码语言:javascript
复制
[[ val == *23?? ]] && echo "value is 23"

而且,如果要从字符串中提取nibbles 2和3,请执行以下操作:

代码语言:javascript
复制
$ result=${val: -4:2}
$ echo "$result"
23

或更短:

代码语言:javascript
复制
$ echo "${val: -4:2}"
23
票数 0
EN

Stack Overflow用户

发布于 2016-08-25 18:58:37

您只需在一行中使用Bash正则表达式就可以做到这一点:

代码语言:javascript
复制
[[ $val =~ 23..$ ]] && echo match
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39151329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档