직접 문자 찾기 및 추출

직접 문자 찾기 및 추출

일부 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.

관련 정보