給定這個文件
$ 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
答案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
一般來說,刪除位元組範圍n到X包容性,你會跑
( head -c n-1; head -c -x-1) )
例如,要刪除第 4 個到第 12 個位元組:
$ (head -c 3 hello.txt; tail -c +11 hello.txt )
hel world
答案4
Perlpack
和unpack
函數擅長處理固定寬度的字串。如果您想使用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
x10
在unpack
模板中意味著跳過字串中的 10 個位元組。