1

我正在尝试使用正则表达式从 格式化一些二进制文件xxd -b,但为了简单地演示这一点,我将向您展示我期望发生的事情:

要删除的正则表达式:/1x|1.*/

文本:1x21y3333333313333->2

如果所有出现的1x都被删除,那么从第一个 1 开始出现的所有内容都应该被删除。发生了什么应该立即显而易见,但如果不是,请使用 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,但这种行为让我感到困惑,也许这里有一个原因(教训)?

4

3 回答 3

2

如果我正确理解你的问题,这会产生你想要的:

$ echo "AA" | xxd -b | sed -E 's/ 0|  .*//g'
00000000:100000110000010001010

此处的关键更改是在前面使用了两个空白,.*以便仅匹配您要删除的部分。

或者,我们可以先删除空白零:

$ echo "AA" | xxd -b | sed -E 's/ 0//g; s/ .*//'
00000000:100000110000010001010
于 2019-03-30T22:04:17.363 回答
1

尝试以下操作:

 s/ 0| [^0].*//g

出现这种行为的原因是 POSIX 规则引擎遵循最长的匹配标准。因此,只要交替的第二边比第一边长,即使是第二边,它也会更早匹配。

于 2019-03-30T22:07:31.160 回答
0

在 gnu sed 上试过

sed -E 's/\s+(0|[a-z.]+)//ig'
于 2019-04-22T18:17:32.830 回答