명령어를 이용해서 현재 세션을 녹화했는데 script
모든 정보가 파일에 저장되어 있었는데, Vim을 이용해서 열어보니 typescript
캐리지 리턴 때문에 s 가 많이 나오더라고요.^M
다음 명령을 사용하여 이 파일을 Unix 형식으로 변환하려고 합니다.dos2unix
명령을 내리는데 할 수가 없어요. 다음과 같은 오류가 발생합니다.
dos2unix: Binary symbol 0x1B found at line 2,dos2unix: Skipping binary file typescript.
왜 이런 일이 발생하는지 궁금합니다. 단순히 양식이 아닌 양식으로 script
출력을 생성하는 이유는 무엇입니까?CR/LF
LF
답변1
typescript
0x1B
위치 지정, 색상, 밝기 등에 대한 이스케이프 시퀀스(ESC 문자)를 포함할 수 있는 터미널로 전송된 모든 내용을 저장합니다. 텍스트 파일에서 일반적인 줄 끝이 다르더라도 터미널 출력에는 CR 및 LF가 포함됩니다.
이 문자는 입력이 이진 파일일 수 있다고 0x1B
가정합니다 . dos2unix
바이너리 수정은 유용하지 않을 수 있으므로 dos2unix
이 작업은 기본적으로 거부됩니다. 그 외에는 문자를 이스케이프 처리하는 데 문제가 없습니다.
dos2unix -f
바이너리로 보이는 파일을 캐스팅 해 볼 수 있습니다 . 이렇게 하면 이 파일의 줄 끝을 수정하는 것이 안전하다는 것을 알 수 있습니다.
또는 vim
CR 문자 삭제를 사용하세요. :%s/
CTRL+ V CTRL+M ENTER
행당 CR++가 :%s/
CTRL여러 개 있을 수 있는 경우V CTRLM//g
ENTER
답변2
0x1b
VT100 터미널 색상 코드의 일부이거나 유사해야 합니다.
http://www.termsys.demon.co.uk/vtansi.htm
<ESC>
ASCII "이스케이프" 문자인 를 나타냅니다0x1B
.
일반적으로 말해서, 어떤 script
기록이 그렇지 않습니까?당신은 무엇을 보았는가하지만 단말기에서는 뭔가가 보이기 때문에원래 터미널기록. 시간 정보도 기록하여 scriptreplay
원래 발생한 것과 동일한 속도로 무슨 일이 일어나고 있는지 보여줄 수도 있습니다.
원래 터미널은 \r
커서를 왼쪽으로 이동하는 데에만 사용되었습니다. 일반 텍스트 파일에서는 더 이상 사용되지 않지만 터미널에는 여전히 많이 사용됩니다. 그것은 어디에나 있지만 \r
대부분의 경우 볼 수 없습니다.
커널 소스 코드를 탐색하면 다음과 같은 내용을 찾을 수 있습니다.
static void puts_raw_fixed(int (*puts_raw) (const char *s, int len),
const char *s, int count)
{
const char *s1;
/* Output '\r' before each '\n' */
while ((s1 = memchr(s, '\n', count)) != NULL) {
puts_raw(s, s1 - s);
puts_raw("\r\n", 2);
count -= s1 + 1 - s;
s = s1 + 1;
}
puts_raw(s, count);
}
터미널 등의 기술적 구현 세부 사항으로 생각하고 무시하십시오(멋진 터미널 작업을 수행하지 않는 한).
원래 로깅을 원하지 않으면 command > output.txt
대신 이전 리디렉션을 사용하거나 script
터미널 자체에서 복사하여 붙여넣을 수도 있습니다. \r
명령 자체가 원시 데이터를 생성하지 않는 한, 아무것도 포함하지 않는 출력을 생성해야 합니다 .
그렇지 않으면 아마도 이 질문을 보게 될 것입니다.스크립트 출력에서 제어 문자(콘솔 코드/색상 포함) 제거사후 처리 TypeScript 파일의 경우. 그러나 결과는 달라질 수 있습니다. 터미널에서는 여러분도 모르는 사이에 많은 일이 일어나고 있으며 script
모두 기록됩니다.
답변3
try (BufferedReader reader = new BufferedReader(new FileReader("inputFile"));
FileWriter writer1 = new FileWriter("outPutFile")) {
String line = reader.readLine();
String cleanText = "";
while (line != null ) {
if(!line.equalsIgnoreCase("[BEGIN TYPESCRIPT]")) {
line = line.replaceAll("\u001B\\[[\\d;]*[^\\d;]", "");
cleanText = cleanText + line.replaceAll("\\p{Cntrl}", "") + System.lineSeparator();
}
line = reader.readLine();
}
writer1.write(cleanText);
} catch (IOException e) {
e.printStackTrace();
}
}
이 기능을 사용하면 세션 기록 TypeScript 파일에 저장된 제어 문자와 VT100 이스케이프 문자를 제거할 수 있습니다. typeScript 헤더 "[BEGIN TYPESCRIPT]"를 건너뛰는 조건을 추가했습니다. 모든 특수 문자를 ""로 바꿉니다.