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最初の文字を除くすべての文字をコピーします。

これは以下を使用して行われます。牛に似た一種の栄養ddしかし、BSDddそれも動作するはずです。

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

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の残りの部分まで、3つの部分に分割します。

  • 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バイトをスキップすることを意味します。

関連情報