다음 형식의 입력 파일이 있습니다.
something here
somethingElseHere^[%-somestuff here
^[%-somestuff here
이 문자는 ^[
이스케이프 문자입니다 \x1b
.
그래서 제가 하고 싶은 일은 ^[
bash 스크립트에서 처음 발생한 이후에 파일의 모든 내용을 삭제하는 것입니다. 따라서 다음과 같은 결과가 나올 것입니다.
something here
somethingElseHere
내 솔루션은 다음과 같습니다. awk -F "\x1b" {'print $1'}
그러나 이것은 다음과 같은 출력을 제공합니다.
something here
somethingElseHere
(empty line here)
따라서 마지막 줄 뒤에 빈 줄을 추가합니다. 그러나 수동으로 제거하면 추가 바이트를 얻습니다. 파일을 최대 \x1b
문자까지 읽고 읽은 모든 문자를 별도의 파일에 쓰는 C++ 프로그램을 만들었지 만 AWK를 사용하면 추가 줄을 제거한 후에도 여전히 C++를 사용할 때보다 1바이트 더 많은 결과를 얻습니다.
편집하다:
AWK를 사용할 때 추가된 EOL 문자일까요? C++ 프로그램으로 작업할 때는 이를 추가하지 않습니다.
고쳐 쓰다:
방금 몇 가지 명령을 시도했는데 에서 열면 대부분 작동 vi
하지만 여전히 추가 바이트가 있고 그것이 어디서 왔는지 모르겠습니다.
$hexdump -x file1
0000000 4329 706f 7279 6769 7468 6328 2029 3931
0000010 3939 4d20 6369 6f72 6f73 7466 4320 726f
0000020 6f70 6172 6974 6e6f 610a 6362 6564 6766
0000030 6968 6b6a 6d6c 6f6e 7170 7372 7574 7776
0000040 7978 534d 5020 4c43 4c58 6f46 746e 3020
0000050 3130 a8f8 4955 0a42
0000058
$hexdump -x file2
0000000 4329 706f 7279 6769 7468 6328 2029 3931
0000010 3939 4d20 6369 6f72 6f73 7466 4320 726f
0000020 6f70 6172 6974 6e6f 610a 6362 6564 6766
0000030 6968 6b6a 6d6c 6f6e 7170 7372 7574 7776
0000040 7978 534d 5020 4c43 4c58 6f46 746e 3020
0000050 3130 a8f8 4955 0042
0000057
bash로 생성한 file1에는 추가 0x0a
(개행)가 추가되었습니다.
답변1
이것이 GNU 솔루션입니다 sed
:
sed -z 's/\x1b.*//'
awk
OP의 의견을 바탕으로 한 솔루션은 다음과 같습니다 .
awk -F '\x1b' 'NF > 1 { printf "%s", $1; exit } 1'
줄바꿈으로 끝나지 않으려는 타당한 이유가 있어야 하지만 일반 텍스트 파일은 줄바꿈으로 끝나야 한다는 점을 기억하세요.