我正在尝试使用正则表达式来格式化xxd -b
中的某些二进制文件,但是为了简单说明这一点,我将向您展示我期望发生的事情:
要删除的正则表达式:/1x|1.*/
文本:1x21y3333333313333
-> 2
在所有出现的1x
都被删除的情况下,应删除从出现的第一个开始的所有内容。应该马上就知道发生了什么,如果没有,请play with this。关键是如果1x
与之匹配,则该模式的其余部分应中止。
这是echo "AA" | xxd -b
(AA\n
的绑定)的输出:
0000000: 01000001 01000001 00001010 AA.
我的目标是1.删除每个字节的前0(ascii = 7位),并2.删除字符串的其余部分,以便仅保留实际的二进制文件。所以我已将其传送到sed 's/ 0//g'
:
0000000:100000110000010001010 AA.
添加第二步,sed -E 's/ 0| .*//g'
:
0000000:
很明显,我希望得到:
0000000:100000110000010001010
我尝试过但尚未完成的工作:
xxd
可以使用-g0
来合并列,但是它在每个字节中保留第一个零(每个字符占用一个字节,而不是7位)-r
在此期间,我将改用perl,但这会使我感到困惑,也许这里有一个道理(教训)?
答案 0 :(得分:2)
如果我正确理解了您的问题,就会得到您想要的:
$ echo "AA" | xxd -b | sed -E 's/ 0| .*//g'
00000000:100000110000010001010
此处的主要更改是在.*
前面使用两个空格,以便仅与您要删除的部分匹配。
或者,我们可以先删除空白零:
$ echo "AA" | xxd -b | sed -E 's/ 0//g; s/ .*//'
00000000:100000110000010001010
答案 1 :(得分:1)
尝试以下操作:
s/ 0| [^0].*//g
可见行为的原因是POSIX规定引擎遵循最长可能匹配标准。因此,只要交替的第二边比第一边长,甚至是顺序第二,它就会更早匹配。
答案 2 :(得分:0)
在gnu sed上尝试
sed -E 's/\s+(0|[a-z.]+)//ig'