다음과 같은 구조의 파일이 있습니다.
2015-03-25 17:08:17
sysUpTimeInstance 93474;^M
1.ValueforState=2500
개행 문자를 바꾸고 세 번째 줄을 두 번째 줄로 유지하고 싶습니다. 즉, 출력은 다음과 같습니다.
2015-03-25 17:08:17
sysUpTimeInstance 93474;1.ValueforState=2500
나는 sed를 사용해 본다:
sed 's/^M$//' myfile.dat > mynewfile.dat
하지만 ^M 기호만 제거됩니다.
어떤 제안이 있으십니까?
답변1
2가지 생각:
sed를 사용하여 캐리지 리턴으로 끝나는 줄에 대해 다음 줄을 추가합니다.
sed '/\r$/ {N; s/\r\n//} ' file
awk를 사용하여 입력 및 출력에 대한 레코드 구분 기호를 정의합니다.
awk -v RS='\r\n' -v ORS='' 1 file
답변2
게시물에 표시된 내용이 ^M
실제로 캐리지 리턴( \r
)이라고 가정하면 다음을 수행해야 합니다.
perl -pe 's/\r\n//g'
이는 입력에 포함된 줄 수에 관계없이 작동합니다. 로 끝나는 모든 줄은 \r\n
다음 줄과 연결됩니다.
답변3
무슨 일이 일어날 수도 있습니다.
^M
실제로 2자가 아니지만 일부 편집자가 캐리지 리턴(CR) 문자를 나타내는 방식인 ^
경우 . M
예를 들어. 이것이 내 Emacs 편집기의 모습입니다. 이 문자는 end-of-line
Windows 파일 시스템의 문자 쌍인 캐리지 리턴(16진수 값 0x0D) + 줄 바꿈(16진수 값 0x0A)의 일부입니다. 개행 문자는 개행 문자라고도 합니다. Unix 파일 시스템은 줄 바꾸기에만 줄 바꿈을 사용합니다. Unix 스타일 줄 끝에서 원치 않는 캐리지 리턴을 제거하려면 sed
다음 정규식을 사용할 수 있습니다. 참고 \x0D
및 \r
둘 다 적용됩니다 sed
. 참고: \r
이는 의 약어입니다 0x0D
.
sed '/\r$/{N; s/\r\n//}'
실제로 문자가 ^M
두 개인 경우(Windows 파일이 Unix 스타일 파일로 잘못 변환될 때 발생하는 경우가 있음) 이를 특수 정규식 문자로 처리해야 합니다. 백슬래시를 사용해야 합니다. 다음 순서를 사용하세요. ^
M
^
escape
\
sed
sed '/\^M$/{N; s/\^M\n//}'
답변4
실제로 세 줄만 있고 항상 두 번째와 세 번째 줄을 연결하려면 다음 명령을 사용할 수 있습니다.
sed -e '2N' -e 's/\r\n//'
N 명령은 다음 줄(즉, 세 번째 줄)을 두 번째 줄에 추가한 다음 교체를 통해 개행 문자를 제거합니다.