我试图从4个字节(32位)十六进制输出中仅过滤一个字节(在xx
之后的半字节2和3 - 小端)。
当我执行命令时,我得到以下输出
000023xx
xx
会有所不同,并且不会修复。
我正在尝试编写一个bash脚本,以查看我得到的输出是否与23
匹配。当我使用以下内容时,它与23xx
匹配,其中xx
介于2-3之间,但我想在23
(小端)之后只匹配xx
的内容
实施例
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
。
答案 0 :(得分:2)
您可以单独使用bash
执行此操作;不需要其他工具。
val=231a
if [[ $val = *23?? ]]; then
echo "$val matches"
else
echo "$val doesn't match"
fi
答案 1 :(得分:0)
您可以在算术扩展中执行AND(&)和右移(>>):
(( ((val >> 8) & 0xFF) == 0x23 )) && echo "value is 23"
小心括号!并使用0x
val=0x231a
代码意味着:
>> 8
),& 0xFF
)和== 0x23
)进行比较。如果结果为true
,请执行:echo "value is 23"
。
如果值实际上是“little endian”,则字符串0000231a
的十六进制值为:
val=0x1a230000
代码将是:
(( ((val >> 16) & 0xFF) == 0x23 )) && echo "value is 23"
或者在文本中进行,如果val中的字符串是val=0000231a
,只需执行:
[[ val == *23?? ]] && echo "value is 23"
并且,如果要从字符串中提取半字节2和3,请执行:
$ result=${val: -4:2}
$ echo "$result"
23
或更短:
$ echo "${val: -4:2}"
23
答案 2 :(得分:0)
您可以使用Bash正则表达式在一行中完成此操作:
[[ $val =~ 23..$ ]] && echo match