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。最初は、 の最初の 2 文字を取得しますhe。2 番目は、 の末尾にスキップしhello、後続のスペースをコピーします。3 番目は、最後の単語にスキップし、world最初の文字以外のすべての文字をコピーします。

これはGNUddしかしBSDA のddどうやら動作するようです。

答え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

一般的に、バイト範囲を削除するにはバツ包括的に、あなたは実行するでしょう

( 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

説明

  • 文字列を 3 つの部分に分割します。 は$head削除する最初のバイトまでの文字列の先頭、 は$skip削除するバイトの範囲、$tailは文字列の残りです。

  • unpackテンプレートは、"A2 A5 A*"上で説明したように文字列を 3 つの部分に分割します。

  • を使用すると$skip、その中のスペースが取得され、 に保存されます$space

  • 目的の出力を得るには、3 つの部分の連結を印刷します。

更新しました

スペースを節約したくないので、解決策はもっと簡単なようです:

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

更新された文字列:

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

x10テンプレートではunpack、文字列内の 10 バイトをスキップすることを意味します。

関連情報