使sed正则表达式交替遵循从左到右的优先级?

时间:2019-03-30 21:46:10

标签: regex sed xxd alternation regex-alternation

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

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

文本:1x21y3333333313333-> 2

在所有出现的1x都被删除的情况下,应删除从出现的第一个开始的所有内容。应该马上就知道发生了什么,如果没有,请play with this。关键是如果1x与之匹配,则该模式的其余部分应中止。

这是echo "AA" | xxd -bAA\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,但这会使我感到困惑,也许这里有一个道理(教训)?

3 个答案:

答案 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'