특정 줄 앞의 문자열 바꾸기

특정 줄 앞의 문자열 바꾸기

다음과 같은 파일이 있습니다.

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의 경우 이전 항목을 검색하여 변환합니다.

관련 정보