sed 대체 명령이 이상하게 동작합니다

sed 대체 명령이 이상하게 동작합니다

다음 줄을 사용하여 파일을 조작하려고 합니다.

331436218071156,XXXXXXXXXXXXXXX6269,12/28/2018,0

이 sed 명령을 사용하십시오:

sed -e '/XXXXXXXXX/ s/^\([0-9]*\),XX*[0-9]*,\([^,]*\),\(.*\)$/\2,\1,\3,/' myfile.csv

다음과 같은 라인을 생성하려면:

12/28/2018,331436218071156,0,

대신 나는 다음을 얻습니다.

,2/28/2018,331436218071156,0

,출력 패턴의 첫 번째 문자가 대체 문자열의 끝으로 대체되는 이유는 무엇입니까?

답변1

입력 CSV 파일은 DOS 텍스트 파일입니다. DOS 텍스트 파일에는 각 줄 끝에 캐리지 리턴 문자가 있습니다. Unix 시스템에서 캐리지 리턴이 출력되면 커서 위치는 줄의 시작 부분으로 이동하고 추가 출력은 이미 있는 내용 위에 인쇄됩니다.

0귀하의 경우 세 번째 캡처링 그룹에는 샘플 데이터 뒤에 오는 캐리지 리턴이 포함되어 있습니다. \3being 0\r( \r캐리지 리턴을 나타냄) 을 사용하면 0\r,줄 끝에서 출력할 수 있습니다. 그러면 가 인쇄되고 0커서가 줄의 시작 부분으로 이동한 다음 쉼표가 인쇄됩니다.

입력 파일을 Unix 텍스트 파일로 변환합니다. 이는 와 같은 유틸리티를 사용하여 가장 쉽게 수행할 수 있습니다 dos2unix.

관련 정보