이 파일이 주어지면
$ 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
. 첫 번째는 처음 두 문자를 가져옵니다 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 pack
과 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바이트를 건너뛰는 것을 의미합니다.