dd 删除字节范围

dd 删除字节范围

给定这个文件

$ cat hello.txt
hello doge world

我想删除一系列字节以结束此操作

$ cat hello.txt
heorld

如果可能的话我想这样做dd。原因是因为我已经使用dd这种方式覆盖字节

printf '\x5E' | dd conv=notrunc of=hello.txt bs=1 seek=$((0xE))

我更喜欢写回同一个文件,但不同的输出文件也可以。

答案1

这是指定块大小、计数和跳过的问题:

$ cat hello.txt
hello doge world
$ { dd bs=1 count=2 ; dd skip=3 bs=1 count=1 ; dd skip=6 bs=1 ; } <hello.txt 2>/dev/null
he orld

上面使用了 3 次调用dd。第一个获取前两个字符he。第二个跳到末尾hello并复制后面的空格。第三个跳到最后一个单词,world复制​​除第一个字符之外的所有内容。

这是用完成的GNUddBSDdd看起来它也应该有效。

答案2

# copy the end piece into correct position
dd bs=1 seek=2 skip=12 conv=notrunc if=hello.txt of=hello.txt

# truncate
dd bs=1 seek=6 if=/dev/null of=hello.txt

马克是对的

答案3

我想这是可能的,dd但这有点像用坦克杀死苍蝇。为什么不

$ printf "%s %s\n" $(head -c 2 hello.txt) $(tail -c 5 hello.txt )
he orld

-c选项意味着(对于head):

   -c, --bytes=[-]K
          print the first K bytes of each  file;  with  the  leading  '-',
          print all but the last K bytes of each file

和对于tail

   -c, --bytes=K
          output the last K bytes; alternatively,  use  -c  +K  to  output
          bytes starting with the Kth of each file

一般来说,删除字节范围nX包容性,你会跑

( head -c n-1; head -c -x-1)  )

例如,要删除第 4 个到第 12 个字节:

$ (head -c 3 hello.txt; tail -c +11 hello.txt )
hel world

答案4

Perlpackunpack函数擅长处理固定宽度的字符串。如果您想使用Perl,请尝试以下操作:

$ perl -le '
    ($head,$skip,$tail) = unpack("A2 A5 A*", "hello world");
    ($space) = $skip =~ m/(\s+)/;
    print $head.$space.$tail;
'
he orld

解释

  • 我们将字符串分为三部分,$head是字符串的开头,直到我们要删除的第一个字节,$skip是我们要删除的字节范围,$tail是字符串的其余部分。

  • unpack"A2 A5 A*"如上所述,模板会将字符串分为三部分。

  • 使用$skip,我们将获得其中的所有空格,并将其保存到$space.

  • 打印三个部分的串联以获得所需的输出。

更新

由于您不想节省空间,因此解决方案似乎更简单:

$ perl -le 'print unpack("A2 x5 A*","hello world")'
heorld

更新后的字符串:

$ perl -le 'print unpack("A2 x10 A*","hello doge world")'
heorld

x10unpack模板中意味着跳过字符串中的 10 个字节。

相关内容