나는 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
끝에 함께 인쇄됩니다.;