'dos2unix'는 'typescript' 파일을 Unix 형식으로 변환할 수 없습니다.

'dos2unix'는 'typescript' 파일을 Unix 형식으로 변환할 수 없습니다.

명령어를 이용해서 현재 세션을 녹화했는데 script모든 정보가 파일에 저장되어 있었는데, Vim을 이용해서 열어보니 typescript캐리지 리턴 때문에 s 가 많이 나오더라고요.^M

다음 명령을 사용하여 이 파일을 Unix 형식으로 변환하려고 합니다.dos2unix명령을 내리는데 할 수가 없어요. 다음과 같은 오류가 발생합니다.

dos2unix: Binary symbol 0x1B found at line 2,dos2unix: Skipping binary file typescript. 

왜 이런 일이 발생하는지 궁금합니다. 단순히 양식이 아닌 양식으로 script출력을 생성하는 이유는 무엇입니까?CR/LFLF

답변1

typescript0x1B위치 지정, 색상, 밝기 등에 대한 이스케이프 시퀀스(ESC 문자)를 포함할 수 있는 터미널로 전송된 모든 내용을 저장합니다. 텍스트 파일에서 일반적인 줄 끝이 다르더라도 터미널 출력에는 CR 및 LF가 포함됩니다.

이 문자는 입력이 이진 파일일 수 있다고 0x1B가정합니다 . dos2unix바이너리 수정은 유용하지 않을 수 있으므로 dos2unix이 작업은 기본적으로 거부됩니다. 그 외에는 문자를 이스케이프 처리하는 데 문제가 없습니다.

dos2unix -f바이너리로 보이는 파일을 캐스팅 해 볼 수 있습니다 . 이렇게 하면 이 파일의 줄 끝을 수정하는 것이 안전하다는 것을 알 수 있습니다.

또는 vimCR 문자 삭제를 사용하세요. :%s/CTRL+ V CTRL+M ENTER

행당 CR++가 :%s/CTRL여러 개 있을 수 있는 경우V CTRLM//g ENTER

답변2

0x1bVT100 터미널 색상 코드의 일부이거나 유사해야 합니다.

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]"를 건너뛰는 조건을 추가했습니다. 모든 특수 문자를 ""로 바꿉니다.

관련 정보