![동일한 패턴으로 시작하는 연속 줄을 삭제하려면 awk 또는 sed를 사용하세요.](https://linux55.com/image/85699/%EB%8F%99%EC%9D%BC%ED%95%9C%20%ED%8C%A8%ED%84%B4%EC%9C%BC%EB%A1%9C%20%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94%20%EC%97%B0%EC%86%8D%20%EC%A4%84%EC%9D%84%20%EC%82%AD%EC%A0%9C%ED%95%98%EB%A0%A4%EB%A9%B4%20awk%20%EB%98%90%EB%8A%94%20sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%84%B8%EC%9A%94..png)
예를 들어 다음 파일이 있는 경우 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