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 個位元組。

相關內容