예를 들어:
CREATE TABLE MWWDATA."VTCat02" (
"ID" NUMBER(10) DEFAULT NULL ,
"Cat" VARCHAR2(255) DEFAULT NULL ,
"Style_Code" VARCHAR2(255) DEFAULT NULL ,
"Vendor_Style_#" VARCHAR2(255) DEFAULT NULL );
위의 예에서 CREATE TABLE로 시작하는 줄을 인쇄하고 나머지 줄에서는 첫 번째 필드만 인쇄하고 싶습니다.
나는 다음과 같은 출력을 원한다
CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_code","Vendor_Style_#");
답변1
와 함께 awk
:
awk '/^CREATE TABLE/{
inside = 1
sep = ""
printf "%s", $0
next
}
inside {
printf "%s", sep $1
sep = ","
if (/\);$/) {
print ");"
inside = 0
}
}'
CREATE TABLE
이는 줄의 시작 부분 에서 시작하고 줄의 끝에서 끝나는 명령문 );
(동일한 줄은 아니지만)에 의존하며 각 열 이름은 후속 줄의 첫 번째 필드입니다(즉, 열 이름에는 다음을 포함할 수 없음). 공백).
답변2
다음 직업에 더 어울리는 것 같습니다 perl
:
perl -0777 -pe 's{(CREATE TABLE \S+\s+)\K(\((?:(?2)|.)*?\))}
{"(" . join(",", $2 =~ /".*?"/g) . ")"}gse'
(인용된 문자열에 일치하지 않는 괄호와 합리적으로 최신 버전의 가 포함되어 있지 않다고 가정합니다 perl
.)
분류:
-0777
, 레코드 구분 기호를 0777(불가능한 바이트 값)로 설정하면 실제로는후루룩 마시다perl
전체 입력에 전체적으로 작용하는 모드입니다 .-pe 'code'
:sed
모드. (이자형코드를 평가합니다이자형한 번에 하나의 레코드를 표현하고피나중에 헹구십시오).s{...}{...}gse
: 대리자g로컬에서는 문자열을 다음과 같이 처리합니다.에스단일 라인(.
개행 문자와도 일치함) 및 대체는 Perl로 처리됩니다.이자형표현을이자형평가하다.\K
: 망치다케이대체할 부품의 시작입니다.(?2)
: 재귀 정규식을 수행하는 한 가지 방법입니다. 여기에는 두 번째 그룹에 포함된 정규 표현식이 포함됩니다(...)
. 그래서\((:(?2)|.)*?\)
. 는(
일련의 추가(...)
그룹 또는 기타 문자(가능한 한 적은 수) 뒤에 입니다)
.join(",", $2 =~ /".*?"/g)
".*?"
일치하는 문자열 (즉, 인용된 문자열) 목록을$2
쉼표로 결합합니다.
답변3
사용 awk
:
awk '{if (NR==1) {printf "%s", $0} else {printf "%s,",$1}} END {printf "^H);\n"}' /tmp/inputfile
입력의 첫 번째 줄에 있으면 첫 번째 일치, 그렇다면 전체 줄을 인쇄하고, 그렇지 않으면 첫 번째 단어와 쉼표를 인쇄합니다.
마지막 단계로 백스페이스를 인쇄하여 마지막 쉼표를 제거하고 닫는 중괄호와 개행 문자를 인쇄합니다. 백스페이스 문자는 를 사용하여 명령줄에 삽입됩니다 ctrl+vctrl+h. 키 ctrl+h는 알파벳 8번째 문자(H)에 해당하고 키코드 8은 백스페이스에 해당합니다.
출력은 다음과 같습니다:
CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_Code","Vendor_Style_#");