给定这个文件
$ 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 个字节。