
예를 들어 다음 파일이 있는 경우 sed 또는 awk를 사용하여 동일한 패턴 "CREATE CURRENT"로 시작하는 연속 행을 삭제하고 싶습니다.
CREATE CURRENT = 'aaaa' ;
CREATE CURRENT = 'bbbb' ;
CREATE CURRENT = 'aaaa' ;
CREATE CURRENT = 'dddd' ;
THIS IS A PARAGRAPH 1 ;
THIS IS A PARAGRAPH 1-1
CREATE CURRENT = 'cccc' ;
THIS IS A PARAGRAPH 2 ;
THIS IS A PARAGRAPH 2-2
결과는 다음과 같습니다
CREATE CURRENT = 'dddd' ;
THIS IS A PARAGRAPH 1 ;
THIS IS A PARAGRAPH 1-1
CREATE CURRENT = 'cccc' ;
THIS IS a PARAGRAPH 2
THIS IS a PARAGRAPH 2-2 ;
답변1
노력하다
awk '{ if ( $1 "x" != before "x" ) print ; before=$1 ; } ' file
어디
$1 "x" != before "x"
첫 번째 필드의 이전 값을 사용하여 테스트before "x"
암시적 문자열 연결을 통해 초기화되지 않은 우선순위 값이 허용됩니다.before=$1
$1의 이전 값을 기억합니다.
OP의 편집 내용을 업데이트하십시오.
awk 'BEGIN {cc=0 }
/CREATE CURRENT/ { if ( !cc++) print ; else next ;}
{cc=0; print ;} '
- 연속된 줄은
CREATE CURRENT
한 번만 인쇄됩니다. - 다른 라인은
cc
값을 다시 활성화합니다. - 새 줄을 추가
' '
하거나 모든 것을 한 줄에 넣을 수 있습니다.
답변2
나는 이것을 sed로 시도했고 작동합니다
sed '/^CREATE CURRENT/ { :a $! { N; /\nCREATE CURRENT/ { s/.*\n//; ba; }; }; }' file
이것이 결과이다
CREATE CURRENT = 'dddd' ;
THIS IS A PARAGRAPH 1 ;
THIS IS A PARAGRAPH 1-1
CREATE CURRENT = 'cccc' ;
THIS IS A PARAGRAPH 2 ;
THIS IS A PARAGRAPH 2-2
답변3
그것을 열려면 vi
다음을 사용할 수 있습니다.
:%s/\(\(\_^CREATE CURRENT\).*\n\)\(\2.*\n\)*/\1/g
파일 끝에 줄이 있으면 파일 끝에 추가 줄 바꿈이 남을 수 있습니다 CREATE CURRENT
. 그렇다면 를 사용하여 추가 줄을 제거할 수 있습니다 :$d
.
만족스러우면 저장하거나 :x
변경 사항을 취소하고 종료하세요.:q!
각 중복 세트의 첫 번째가 아닌 마지막을 유지하려면 다음을 사용하십시오.
:%s/\(\(\_^CREATE CURRENT\).*\n\)\+\(\2.*\n\)/\3/g