Bash에서 SQL 파일을 청크로 읽기

Bash에서 SQL 파일을 청크로 읽기

나는 Bash에서 문자열 교체 유형 작업을 수행하려고 노력해 왔습니다. 하지만 보기만큼 쉽지는 않습니다. 이에 대한 설명은 다음과 같습니다.

여러 개의 SQL 파일이 포함되어 있다고 가정해 보겠습니다.선택하다거기에 있는 진술. 각선택하다블록은 세미콜론(;).

내 목표는 각 청크를 개별적으로 잡고 몇 가지 작업을 수행하는 것입니다. 그러나 스크립트는 다른 SQL 파일을 사용하고 각 블록을 변수에 저장하므로 이러한 블록을 동적으로 식별할 수 있어야 합니다(예:1) 나중에 블록을 쉽게 사용할 수 있도록 합니다.

PS 저는 지난 주 동안 이 문제로 어려움을 겪었습니다. 조언을 주시면 대단히 감사하겠습니다. 또한 아래에서는 지금까지 사용한 일부 정규식 유형 항목을 볼 수 있습니다.

egrep -e "^(\s|SELECT).*.[^;]\s*" test.sql

cat test.sql | awk '" "{found=0} /SELECT/{found=1} {if (found) print }'

첫 번째 방법이 가장 잘 작동하고 목표에 가장 가깝지만 SELECT 문 블록을 분리하여 저장하는 방법을 찾을 수 없습니다. 두 번째는 비슷한 표현을 사용하여 세미콜론을 찾습니다. 그 외에는 두 항목 사이에 있는 모든 항목을 세 번째 항목으로 사용하도록 스크립트에 지시한 다음 세 항목을 전체적으로 함께 저장해 보았습니다. 하지만 제대로 작동하지 못했습니다. SELECT 문은 여러 줄입니다.

답변1

"newline" 이외의 구분 기호를 사용하여 읽기 루프를 사용할 수 있습니다. 이렇게 하면 read명령은 bash구분 기호로 끝나는 경우 여러 줄을 하나로 처리합니다.

참고: 이 방법은 파일의 주석이나 문자열에 세미콜론이 나타날 수 있는 경우 적합하지 않습니다. 이것은 파서가 아닙니다. 단순한 읽기 루프일 뿐입니다.

while read -rd ';' sql
do
    if [ "${sql#SELECT}" = "$sql" ]
    then
        echo "Not a SELECT!"
    else
        echo "This is the command I got:"
        echo ">>$sql<<"
    fi
done < test.txt 

read -rd ';' sql세미콜론이 보일 때까지 입력을 읽 습니다 . 블록은 변수에 위치하게 됩니다 $sql.

if루프 내에서 변수의 텍스트 시작 부분에서 단어를 제거하면 SELECT변경되는지 확인합니다. 기본적으로 텍스트가 단어로 시작하지 않는지 묻는 것입니다 SELECT.

read"단어"를 찾을 때 각 블록의 첫 번째 문자와 후행 공백이 제거됩니다 . 따라서 세미콜론 앞뒤의 빈 줄은 삭제됩니다.

텍스트 파일 예:

   SELECT *
FROM PLANTS

WHERE TYPE='BUSH'

;

INSERT INTO PLANTS (TYPE,NAME,ID)
VALUES ('TREE', 'Oak', 15)    ;   

SELECT NAME
FROM PLANTS
WHERE NAME LIKE 'O%';

다음과 같은 출력이 생성됩니다.

This is the command I got:
>>SELECT *
FROM PLANTS

WHERE TYPE='BUSH'<<
Not a SELECT!
This is the command I got:
>>SELECT NAME
FROM PLANTS
WHERE NAME LIKE 'O%'<<

답변2

awk -v RS=";" '/SELECT/{print $0";"}'

레코드( is RS) ;에 문자열이 있으면 SELECT끝에 함께 인쇄됩니다.;

관련 정보