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

위의 내용은 세 가지 호출을 사용합니다 dd. 첫 번째는 처음 두 문자를 가져옵니다 he. 두 번째는 끝으로 건너뛰고 hello뒤따르는 공간을 복사합니다. 세 번째는 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에게엑스포함하여, 당신은 실행할 것입니다

( head -c n-1; head -c -x-1)  )

예를 들어 4~12번째 바이트를 제거하려면 다음을 수행합니다.

$ (head -c 3 hello.txt; tail -c +11 hello.txt )
hel world

답변4

Perl packunpack함수는 고정 너비 문자열을 처리하는 데 능숙합니다. 을 사용하려면 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바이트를 건너뛴다는 의미입니다.

관련 정보