일부 SQL이 포함된 파일이 있고 쉘 스크립트를 사용하여 변환할 필드를 찾고 싶습니다.
예를 들어 다음 SQL이 포함된 abc.txt 파일이 있습니다.
SELECT field1,field2,field3,field4,cast(field5를 정수로),cast(substr(field6,5,10)을 정수로),(field7 = '0000/00/00'인 경우 Cast(field7을 날짜로) else ( field8은 날짜) end)는 field7, substr(field9,5,10) FROM TEMP;
원하는 출력:
필드 5
필드 6
필드 7
답변1
어때요?
awk 'BEGIN{FS="cast\\(";OFS="\n\n"}{ for(i = 1; i <= NF; i++) { sub("[ ),].*","",$i);gsub("^.*\\(","",$i) } {$1=""; print}}'
솔루션은 모든 행의 "cast(" 인스턴스를 반복하고 접두사와 접미사를 제거합니다.
답변2
field<decimals>
cast(...)
일치하지 않는 괄호가 없다고 가정하고 GNU grep
또는 PCRE를 지원하는 호환 빌드를 사용하여 명령문 내에서 발생을 찾으려면 다음을 수행하십시오 .
<abc.txt grep -Po 'cast(\((?:[^()]++|(?1))*\))' |
grep -Po '\bfield\d+\b'
이는 PCRE의 기능을 사용하여 정의됩니다.재귀적자주 사용되는 표현. 위의 인용문은 (?1)
에 포함된 정규식 이므로 "R"로 시작 하고 괄호가 아닌 숫자( 의 역추적되지 않는 버전 ) 또는 그 이상의 "R" 뒤에 가 오는 정규식을 (...)
찾고 있습니다 .cast
(
++
+
)
이를 통해 다음 오프닝 )
과 일치하는 항목을 찾을 수 있습니다.(
cast
두 번째 것은 grep
추출만 수행합니다 field<decimal>
(다음으로 둘러싸여 있음).단어 경계( \b
)) cast(...)
첫 번째 grep
추출된 명세서에서.
이러한 SQL 문이 한 줄에 있다고 가정합니다. 그렇지 않은 경우 -z
이 옵션을 첫 번째 옵션에 추가 할 수 있습니다 grep
.