sed - "^M"을 쓸 수 없으면 "^M"을 바꿉니다.

sed - "^M"을 쓸 수 없으면 "^M"을 바꿉니다.

저는 cygwin을 사용하여 RAM(512M)이 제한된 소형 가상 머신에 연결하고 있습니다.

또한 4GB csv 파일에서 sqlite3 데이터베이스로 가져오려고 하는데 2행(총 8.717.201행)을 제외하고는 가져오기에 대한 단서가 없습니다.

라인 2에 control-m 문자(^M)가 있는 것 같아서 csv 형식이 깨지고 가져오기에 실패합니다.

control-m char을 사용하려고 하면 sed 's|,^M|,|' file.csv텍스트 ASCII(2자)가 작성되므로 대체 항목을 검색하지 않습니다.

이 작업을 수행하기 위해 테스트 파일을 사용하고 검색 및 바꾸기를 위해 열면 vi코드로 작성된 것을 볼 수 있습니다(파란색 ^M 및 단일 문자로 작동함).

CSV 파일을 복구하는 방법? (또는 cygwin에서 control-m 시퀀스를 어떻게 다시 작성합니까?

문제가 있는 줄의 예:

$ cat -e test
keyword3,keyword1,keyword4$
keyword1,keyword2,keyword3^M$
,keyword4$
keyword5,keyword1,keyword2$

어떻게되어야합니까 :

$ cat -e test
keyword3,keyword1,keyword4$
keyword1,keyword2,keyword3,keyword4$
keyword5,keyword1,keyword2$

PS: 보시다시피 영어는 제 모국어가 아니어서.. 실수해서 죄송해요 ́_(ツ)_/̱

답변1

실제로 캐리지 리턴은 잘못된 개행을 식별하는 데 도움이 될 수 있습니다.

s '/^M$/{N;s/^M\n//;}' test

Steeldriver가 쓴 것처럼 ^M일반적 ctrlV으로 ctrlM.

명령의 의미

  • /^M$/{...}: 줄 끝에 페이지 나누기가 있는 줄에서 중괄호로 묶인 명령을 실행합니다.
  • Next는 버퍼에 다음 줄을 추가하고 줄 사이에 개행 문자를 삽입합니다.
  • s/^M\n// s캐리지 리턴 + 개행 문자를 아무것도 없는 것으로 대체(개행 문자 제거)

이 간단한 스크립트는 행이 최대 한 번 중단된다고 가정합니다. 그렇지 않으면 다음과 같은 것이 필요합니다.

sed 'H;1h;$!d;x;s/^M\n//g' file

답변2

교체를 위해 sed 또는 vi에서 개행(또는 Enter) 표현을 얻는 한 가지 방법 ^M은 다음을 입력하는 것입니다.

ctrlV enter

관련 정보