SQL 문에 세미콜론을 추가하는 방법은 무엇입니까?

SQL 문에 세미콜론을 추가하는 방법은 무엇입니까?

내가 이것을 가지고 있다고 가정해 봅시다(개행 없이 내가 보여주는 형식을 사용하여)

INSERT INTO `somthing` (`something`) VALUES (1) INSERT INTO `somthing` (`somethingelse`) VALUES ('something with a (paranthesis) in it') INSERT INTO `somthing` (`something`) VALUES (3) INSERT INTO `somthing` (`something`) VALUES (4)

내가 원하는 출력은

INSERT INTO `somthing` (`something`) VALUES (1); INSERT INTO `somthing` (`somethingelse`) VALUES ('something with a (paranthesis) in it'); INSERT INTO `somthing` (`something`) VALUES (3); INSERT INTO `somthing` (`something`) VALUES (4);

따라서 이는 합법적인 SQL 쿼리입니다. 나는 이것을 sed에서 시도했습니다 :

sed 's/\(VALUES ([^)]*)\)/\1;/g')

값 안에 괄호가 없으면 작동합니다. 이 문제를 해결하는 방법을 모르겠습니다. 기본적으로 , (마지막 것) 앞에 세미콜론이 있으면 끝에 (.*)세미콜론을 추가하고 싶습니다 .)VALUES

답변1

모든 상황에 맞는 단순한 패턴은 없습니다. 명령문이 끝나는 시점을 결정하려면 SQL 파서를 작성해야 합니다.~해야 한다네... 그래도 특별한 마법이 일어나지 않기를 바랄 필요가 있어요. 이제 ANSI SQL은 튜링 완료가 아니므로(확장은 가능할 수 있음)할 수 있다파서를 작성하세요...

또는 스택 기반 파서를 작성하여 ;끝 뒤에 ...를 추가 )하고 잘못된 구문을 처리할 수 있습니다.

대신 잘못 일치하지 않을 가능성이 높은 것을 사용하고 싶을 수도 있습니다. 예를 들어, 이 코드는 문을 가져와 INSERT INTO;앞에 하나를 추가하고 끝에 하나를 추가하는 것을 기억합니다.

sed -e 's/\( INSERT INTO `somthing` (`something`) VALUES (\)/;\1/g' -e 's/$/;/'

삽입된 데이터에 특정 문자열이 있으면 분명히 실패합니다...

답변2

예를 들어, 문의 다른 부분을 일치시켜 문제를 해결할 수 있습니다.

sed -e 's/\(VALUES (`[^`]*`)\)/\1;/g' \
    -e "s/\(VALUES ('[^']*')\)/\1;/g" \
    -e 's/\(VALUES ([0-9]*)\)/\1;/g'

괄호 안의 내용에 의존하지 않습니다.

답변3

1) 제공된 예제 입력에 표시된 것처럼 가설의 끝 뒤에는 키워드 또는 줄 끝이 )옵니다 .VALUESINSERT

perl -pe 's/VALUES\s*\(.*?\)(?=\s*INSERT|$)/$&;/g' file

VALUES2) 그것이 존재할 수 있는 두 가지 방법이 있다고 가정합니다 .

  • 본질적인 가치는 없을 ()것입니다.'
  • 내부 값은 ()다음으로 시작 ('하고 끝납니다.')

perl -pe "s/VALUES\s*\([^')]*\)/$&;/g ; s/VALUES\s*\('.*?'\)/$&;/g" file

관련 정보