【问题标题】:Feed hexdump to sed将 hexdump 输入 sed
【发布时间】:2022-08-18 16:04:27
【问题描述】:

我有一个名为 samples.txt 的文件,其中包含 374371 行,它是这样创建的:

hexdump -e \'8/1 \"%02x \" \"\\n\"\' samples.bin > samples.txt

它看起来像这样(已弃用):

1a 03 1a 03 4a 03 57 03
4b 03 44 03 1e 03 09 04
10 03 19 03 40 03 ae 03
1e 03 26 03 33 03 ad 03
10 03 84 03 43 03 62 03
e0 03 16 03 34 03 c4 03
f8 02 3b 03 53 03 61 03
10 03 15 03 42 03 58 03
23 03 1f 03 57 03 62 03
17 03 73 03 31 03 33 03
14 03 ff 02 30 03 51 03
5f 03 42 03 47 03 7e 03
ba 03 26 03 35 03 a0 03
08 03 33 03 36 03 c8 03
0c 03 38 03 97 03 44 03

和以下 sed 命令:

echo \"                ch0    ch1    ch2    ch3\"; cat -n samples.txt | sed \'s/\\s*\\([0-9]*\\)\\s*\\([0-9a-f]*\\) \\([0-9a-f]*\\) \\([0-9a-f]*\\) \\([0-9a-f]*\\) \\([0-9a-f]*\\) \\([0-9a-f]*\\) \\([0-9a-f]*\\) \\([0-9a-f]*\\)/Sample \\1:\\t0x\\2\\3 0x\\4\\5 0x\\6\\7 0x\\8\\9/\' | head -n 15

给我这样的输出:

                ch0    ch1    ch2    ch3
Sample 1:       0x1a03 0x1a03 0x4a03 0x5703
Sample 2:       0x4b03 0x4403 0x1e03 0x0904
Sample 3:       0x1003 0x1903 0x4003 0xae03
Sample 4:       0x1e03 0x2603 0x3303 0xad03
Sample 5:       0x1003 0x8403 0x4303 0x6203
Sample 6:       0xe003 0x1603 0x3403 0xc403
Sample 7:       0xf802 0x3b03 0x5303 0x6103
Sample 8:       0x1003 0x1503 0x4203 0x5803
Sample 9:       0x2303 0x1f03 0x5703 0x6203
Sample 10:      0x1703 0x7303 0x3103 0x3303
Sample 11:      0x1403 0xff02 0x3003 0x5103
Sample 12:      0x5f03 0x4203 0x4703 0x7e03
Sample 13:      0xba03 0x2603 0x3503 0xa003
Sample 14:      0x0803 0x3303 0x3603 0xc803
Sample 15:      0x0c03 0x3803 0x9703 0x4403

在我看来,将 hexdump 的输出重定向到一个临时的 samples.txt 文件效率低下,因为对于一个,你必须在最后删除它,对于两个,也许对内存中的数据使用 sed 比它更快在磁盘上。如何跳过 samples.txt 文件并获得相同的结果?

  • 我有一个模糊的想法,为什么你不能使用直接管道,但为了让你的问题更清楚,你可能需要明确解释。我的意思是,我假设您确实尝试过并且不喜欢结果。也许讨论您尝试的结果与您想要的结果的差异。
  • 嗨@Yunnosch,我修改了我原来的问题。

标签: sed cat hexdump


【解决方案1】:

如果我正确理解您的意图,我认为以下内容应该有效。

hexdump -e '8/1 "%02x " "\n"' samples.bin | cat -n | sed '....

【讨论】:

  • 嗨@Dino Dini,我实际上打算尝试一下,但我认为它不会起作用。谢谢你。
  • 这工作echo " ch0 ch1 ch2 ch3"; hexdump -e '8/1 "%02x " "\n"' samples.bin | cat -n | sed 's/\s*\([0-9]*\)\s*\([0-9a-f]*\) \([0-9a-f]*\) \([0-9a-f]*\) \([0-9a-f]*\) \([0-9a-f]*\) \([0-9a-f]*\) \([0-9a-f]*\) \([0-9a-f]*\)/Sample \1:\t0x\2\3\t0x\4\5\t0x\6\7\t0x\8\9/' 谢谢@Dino Dini
【解决方案2】:

替代 xxd 和 coreutils:

{
  # Print header
  printf "\t\tCh0    Ch1    Ch2    Ch3\n"

  # Create hexdump of data
  xxd -p samples.bin       |

  # Use 16 bit samples
  fold -w4                 |

  # Add hex indicator
  sed 's/^/0x/'            |

  # Data contains 4 interleaved channels
  xargs -n4                |

  # Number each sample
  nl -n ln                 |
  sed 's/ /:/; s/^/Sample /'
} > samples.out

samples.out的内容:

                Ch0    Ch1    Ch2    Ch3
Sample 1:       0x1a03 0x1a03 0x4a03 0x5703
Sample 2:       0x4b03 0x4403 0x1e03 0x0904
Sample 3:       0x1003 0x1903 0x4003 0xae03
Sample 4:       0x1e03 0x2603 0x3303 0xad03
Sample 5:       0x1003 0x8403 0x4303 0x6203
Sample 6:       0xe003 0x1603 0x3403 0xc403
Sample 7:       0xf802 0x3b03 0x5303 0x6103
Sample 8:       0x1003 0x1503 0x4203 0x5803
Sample 9:       0x2303 0x1f03 0x5703 0x6203
Sample 10:      0x1703 0x7303 0x3103 0x3303
Sample 11:      0x1403 0xff02 0x3003 0x5103
Sample 12:      0x5f03 0x4203 0x4703 0x7e03
Sample 13:      0xba03 0x2603 0x3503 0xa003
Sample 14:      0x0803 0x3303 0x3603 0xc803
Sample 15:      0x0c0a 0x3803 0x9703 0x4403

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2015-06-18
    • 2013-12-25
    • 2011-04-30
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多