예를 들어:
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
: 3월케이s 교체할 섹션의 시작 부분입니다.(?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_#");