다음과 같은 파일이 있습니다.
ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0 COMPRESS 0 ,
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR ,
PRIMARY INDEX ( CALENDAR_DATE );
PRIMARY가 포함된 줄 앞의 줄에서 ','를 ')'로 바꾸고 싶습니다.
결과는 다음과 같습니다.
ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0 COMPRESS 0 )
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR )
PRIMARY INDEX ( CALENDAR_DATE );
답변1
사용 GNU sed
:
sed 'N;s/,\(\s*\n.*PRIMARY\)/)\1/;P;D' file
ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0 COMPRESS 0 )
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR )
PRIMARY INDEX ( CALENDAR_DATE );
N
패턴 공간에 입력의 다음 줄을 읽거나 추가합니다.P
현재 패턴 공간에 첫 번째 포함된 개행 문자를 인쇄합니다.D
패턴 공간에서 최대 첫 번째 삽입된 개행 문자를 제거합니다. 다음 사이클을 시작하되, 패턴 공간에 아직 데이터가 있으면 입력에서 읽기를 건너뜁니다.
답변2
온라인으로 문자열 교체를 수행하여 파일을 되돌려 보십시오.뒤쪽에PRIMARY를 선택한 다음 파일을 다시 반전합니다.
tac file | sed '/PRIMARY/ {n; s/,$/)/}' | tac
답변3
이 시도,
perl -0777 -pe 's/,([^\n,]*\n[^\n]*PRIMARY)/)$1/g'
이는 인 라인에 포함된 라인 앞의 마지막 라인을 대체합니다 ,
.)
PRIMARY
설명하다
perl -0777
전체 파일을 후루룩 소리내어 읽습니다(한 줄로 읽습니다).s/search_pattern/replacement/g
전역 교체 검색 패턴
답변4
그리고POSIX-라이 sed
다음을 수행할 수 있습니다.
sed -e '
/PRIMARY/!{x;1!p;d;}
x;s/,/)/;$G
' input-file.txt
산출:
ID_SOUR_CALENDAR BIGINT NOT NULL DEFAULT 0 COMPRESS 0 )
UNIQUE PRIMARY INDEX ( CALENDAR_DATE );
ID ,
ID_SOUR )
PRIMARY INDEX ( CALENDAR_DATE );
피복재:
- PRIMARY 행이 아닌 경우 행을 저장하고 보존 조치에 저장한 행을 인쇄합니다.
- PRIMARY의 경우 이전 항목을 검색하여 변환합니다.