Bash는 awk를 사용하여 패턴 뒤의 모든 문자를 삭제합니다.

Bash는 awk를 사용하여 패턴 뒤의 모든 문자를 삭제합니다.

다음 형식의 입력 파일이 있습니다.

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.*//'

awkOP의 의견을 바탕으로 한 솔루션은 다음과 같습니다 .

awk -F '\x1b' 'NF > 1 { printf "%s", $1; exit } 1'

줄바꿈으로 끝나지 않으려는 타당한 이유가 있어야 하지만 일반 텍스트 파일은 줄바꿈으로 끝나야 한다는 점을 기억하세요.

관련 정보