구분 기호로 긴 SQL 표현식을 분할합니다.

구분 기호로 긴 SQL 표현식을 분할합니다.

문맥

SQL*Plus를 사용하여 긴 줄(8,000자 이상)이 포함된 덤프를 가져오려고 하므로 오류가 발생합니다 SP2-0027: Input is too long (> 2499 characters). 이는 하드 코딩된 제한 사항이므로 극복할 수 없습니다.

예상되는 솔루션

,마지막(쉼표) 문자의 예상 너비보다 긴 bash 및 분할 줄로 입력을 스트리밍하고 싶습니다 .

그래서 나는 다음과 같은 것을 가져야합니다

cat my_dump.sql | *magic_command* | sqlplus system/oracle@xe

세부 사항

  1. 최신 버전에서는 최대 4999자까지 줄을 수용할 수 있다는 것을 알고 있지만 아직 줄이 더 깁니다( grep '.\{5000\}' my_dump.sql | wc -l).
  2. 덤프를 수동으로 업데이트하는 것은 실제로 가능하지 않습니다.
  3. 나는 사용해 보았지만 tr이것은 내가 원하지 않는 모든 행을 분할합니다
  4. fmt사용해 보았지만 fold사용자 정의 구분 기호를 사용하는 것이 불가능한 것 같습니다.
  5. 현재 보고 있는데 " 2500자가 넘으면 처음 2500자 내에서 마지막 일치 항목을 찾습니다." sed에 대한 정규식을 찾을 수 없는 것 같습니다.,

답변1

다음과 같이 시도해 보세요:

sed -re '/.{2500}/ s/.{,2500},/&\n/g'

설명하다:

  • /.{2500}/줄에 2,500자(또는 그 이상)가 포함된 경우...
  • s/.{,2500},/&\n/g최대 2,500자를 바꾼 후 ,줄바꿈을 추가하세요.

이것이 대체 불가능한 ","를 대체하더라도 놀라지 않을 것입니다...

답변2

나는 다음과 같은 awk 명령이 작동할 것이라고 상상합니다:

awk 'length > 2499 {gsub(/.{0,2498},/, "&\n")} 1'

정규식은 쉼표 앞에 최대 2498자(즉, 쉼표를 포함하여 2499자)를 허용하고 그 뒤에 개행 문자를 삽입합니다. (오류 메시지에 해당 번호가 언급되어 있으므로 2499를 사용했습니다.)

관련 정보