![sed가 실수로 Windows 줄 끝을 변경했습니다. 이것을 어떻게 피할 수 있습니까?](https://linux55.com/image/140885/sed%EA%B0%80%20%EC%8B%A4%EC%88%98%EB%A1%9C%20Windows%20%EC%A4%84%20%EB%81%9D%EC%9D%84%20%EB%B3%80%EA%B2%BD%ED%96%88%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%EC%9D%B4%EA%B2%83%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%94%BC%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
저는 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
.