나는 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