sed가 탐욕스럽게 일치하지 않습니다

sed가 탐욕스럽게 일치하지 않습니다

나는 sed가 탐욕스럽지 않은 매칭을 할 수 없다고 생각합니다. sed가 개행 문자와 일치하지 않게 하는 방법이 있나요?

나는 다음과 같이 sed를 사용하고 있지만 후자(.*)는 예상대로 모든 것과 일치하지만 원하지 않는 새 줄도 일치합니다.

sed -i -s -r 's|^([A-Za-z0-9*()])(.*)|INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "\1\2", "" )|' /path/to/files/*

내가 얻는 결과는 다음과 같습니다.

INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Some text
", "" )

답변1

내 입력 파일 중 하나가 다음과 같은 경우

Abba
Ebbo
Obbe

...그러면 명령이 다음과 같이 수정될 것으로 예상됩니다.

INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Abba", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Ebbo", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Obbe", "" )

그러나 입력 파일이 CRLF 줄 끝이 있는 DOS 텍스트 파일인 경우 후행 캐리지 리턴으로 인해 결과가 다음과 같이 나타납니다.

", "" )INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Abba
", "" )INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Ebbo
", "" )INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Obbe

...파일이 Unix 시스템에서 처리되는 경우.

이는 캐리지 리턴 문자가 터미널에서 해석될 때 커서를 줄의 시작 부분으로 다시 이동시키기 때문입니다.

이것실제이 경우 데이터는 ( \r캐리지 리턴 기호로 표시됨) 입니다.

INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Abba\r", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Ebbo\r", "" )
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "Obbe\r", "" )

이 문제를 해결하려면 입력 파일을 DOS 텍스트 파일에서 Unix 텍스트 파일로 변환하십시오. 이 작업은 다음과 같은 도구를 사용하여 대량으로 수행하거나 명령의 일부로 수행 dos2unix할 수 있습니다 .sed

sed -i \
    -e 's/[[:space:]]$//' \
    -e 's/^[[:alnum:]*()].*/INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "&", "" )/' files

첫 번째 표현식은 각 줄의 끝에서 공백과 유사한 문자를 제거하고(캐리지 리턴은 그 중 하나입니다) 두 번째 표현식은 대체를 수행합니다.

줄 번호에 의존하지 않고 확장된 정규식 지원이 필요하지 않으므로 -s및 는 필수가 아닙니다 .-r

관련 정보