sed가 실수로 Windows 줄 끝을 변경했습니다. 이것을 어떻게 피할 수 있습니까?

sed가 실수로 Windows 줄 끝을 변경했습니다. 이것을 어떻게 피할 수 있습니까?

저는 Windows 스타일 줄 끝이 있는 일부 소스 파일에서 후행 공백을 제거하려는 Linux에서 이식 가능한 응용 프로그램을 개발 중입니다. 줄 끝을 유닉스로 변경하면 안 됩니다.

"sed"를 사용하는 코드는 매우 간단하며 온라인에서 찾을 수 있습니다.

sed -i.bak -E 's/[[:space:]]+$//' myfile

문제는 이 작업을 수행한 후 diff파일의 모든 줄(및 결과 .bak)이 다르다는 것입니다. 물론 이는 사실일 수 없습니다. 이 특정 파일에는 후행 공백이 있는 줄이 1개만 있습니다.

hexdump(내가 사용하는 od -x myfile) 유틸리티를 사용하여 확인한 결과 원본 파일의 첫 번째 줄은 "0d0a"로 끝나는 반면 sed 편집 파일에서는 "0a"로 끝나는 것이 분명합니다.

줄 끝 부분에 영향을 주지 않고 후행 공백 제거를 수행하는 방법에 대한 정보를 찾을 수 없습니다. 어떤 방법이 있나요?

"캐리지 리턴" 문자가 "[[:space:]]" 정규식 그룹의 일부인 경우 아마도 다음과 같습니다.

sed -i.bak -E 's/[ \t]+$//' myfile

작동해야합니다. 하지만 그렇지 않습니다. 동일한 파일이 생성됩니다. 또한 "-e" 플래그를 사용해 보았으며 심지어 플래그도 전혀 사용하지 않았습니다. 결과 파일은 여전히 ​​원본 파일과 동일하며 후행 공백이 제거되지 않습니다.

답변1

예, (\r = ^M = 0x0D) 문자는 space"문자 클래스"에 속합니다. 두 번째 정규식에서 허용하거나 와일드카드를 사용하세요.

sed -i.bak -E 's/[ \t]+.$/\r/' myfile

또는 특정 문자(예:

sed -i.bak -E 's/[ \t]+\r$/\r/' myfile

sed기호 를 인식할 수 없으면 다른 \r기호를 사용해 보세요. 16진수 \x0D또는 8진수 와 같습니다 \015.

관련 정보