ed는 줄을 연결하기 위해 ASCII 텍스트, CRLF, LF 줄 종결자를 사용하지 않습니다.

ed는 줄을 연결하기 위해 ASCII 텍스트, CRLF, LF 줄 종결자를 사용하지 않습니다.

저는 현재 Windows의 Debian WSL에서 Gnu ed 버전 1.18을 실행하고 있습니다. 다음 인코딩을 사용하여 파일을 편집하는 경우:

ASCII text, with CRLF, LF line terminators

또는

ASCII text, with CRLF,

그런 다음 ed는 행을 올바르게 연결하지 못합니다 j command. 대신 연결할 첫 번째 행을 제거합니다.

이 질문은 과연아니요이는 파일이 ed에서 생성된 경우에 발생하지만 다른 프로그램에서 생성된 후 ed에서 편집된 파일에는 영향을 미칩니다. GNU ed 1.17에서도 동일한 문제가 발견되었습니다.

이것은 버그입니까? 이 문제를 피하는 방법은 무엇입니까?

답변1

편집자는 ed문서가 Unix 텍스트 파일이라고 가정합니다. DOS 텍스트 파일(CRLF 줄 끝이 있는 파일)이 나타나면 각 줄 끝에 있는 캐리지 리턴 문자를 다른 문자로 처리합니다.

즉, 다음과 같은 DOS 텍스트 파일이 있는 경우(여기서는 ,l파일을 나열하는 명시적인 방법을 사용하여 볼 수 있으며 캐리지 리턴은 으로 표시되고 \r각 줄의 끝은 으로 표시됨 $)

line 1\r$
line 2\r$
line 3\r$

...다음을 사용하여 2,3j세 번째 줄을 두 번째 줄의 끝에 연결합니다.

line 1\r$
line 2\rline3\r$

ed터미널에 출력할 때 line 2\rline3\r커서는 줄 중간에 포함된 리터럴 캐리지 리턴을 통해 줄의 시작 부분으로 다시 이동하여 텍스트가 line 2사라지는 듯한 느낌을 줍니다(실제로는 그렇습니다.덮여통과 line 3).

해결책은 다음과 같은 도구를 사용하여 문서를 Unix 텍스트로 변환하거나 다음을 dos2unix사용하여 편집기에서 모든 단일 후행 캐리지 리턴을 제거하는 것입니다.

,s/^M$//

... ^M사용하여 입력하는 위치 Ctrl+VCtrl+M (리터럴 캐리지 리턴을 입력함).

GNU ed버전 1.18 이상에서는 이 옵션을 사용하여 편집기를 시작하도록 선택할 수도 있습니다. --strip-trailing-cr이 옵션은 파일을 열 때 줄 끝에 있는 단일 후행 캐리지 리턴을 제거합니다. 이것이 바로 s///위의 명령이 수행하는 작업입니다.

관련 정보