저는 현재 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///
위의 명령이 수행하는 작업입니다.