패턴을 검색하고 처음 두 줄만 바꾸고 나머지는 삭제하세요.

패턴을 검색하고 처음 두 줄만 바꾸고 나머지는 삭제하세요.

"class"로 시작하는 알 수 없는 행 수를 포함하는 파일이 있습니다. "class"로 시작하는 처음 두 줄을 다른 것으로 바꾸고 해당 두 줄만 유지하고 나머지는 삭제하고 싶습니다.

예:

school 
class A
class B
class C
class D
classroom

원하는 출력:

school
class X
class Y
classroom

sed를 보고 있는데 좋은 해결책을 찾을 수 없습니다. 어떤 조언이라도 대단히 감사하겠습니다!

답변1

사용GNU sed정규식 패턴을 확장하여 -E예약된 공간을 카운터로 사용할 수 있습니다.

sed -Ee '
  /^class(\s|$)/!b
  G
  /\n{3}/d
  /\n{2}/s/.*/class Y/
  /\n{1}/s/.*/class X/
  p;z;H;d
' file

간략한 설명:

  • 사용된 명령 편집 sed:b G z h H d s/// p
  • 이에 대해서는 GNU sed 매뉴얼을 참조하십시오.
  • 아이디어는 단어 클래스로 시작하지 않는 모든 줄을 계속 인쇄하는 것입니다.
  • 이제 계급선에 대해서는 한 번 본 것인지, 두 번 본 것인지, 두 번 이상 본 것인지 세 가지를 명확히 해야 합니다.
  • 우리는 예약된 공간의 내용을 패턴 공간에 연결하고 줄 바꿈에 세심한 주의를 기울입니다.
  • 개행 문자가 3개 발견되면 => 2번 이상 발생합니다. 이 줄을 즉시 삭제하세요. 더 이상 처리되지 않습니다.
  • 2개의 줄 바꿈이 발견되면 => 두 번째로 표시되므로 변경하세요.
  • 첫 만남에서는 또 다른 변화도 생겼다.
  • 마지막 두 가지 경우 중 하나의 경우 예약된 공간을 늘리십시오.

와 함께실용성은 간단합니다.

awk '
  BEGIN {
    a[1]="class X"
    a[2]="class Y"
  }
  $1 == "class" {
    if ( k++ < 2 ) {
      $0 = a[k]
    } else { next }
  }1
' file

산출:

school 
class X
class Y
classroom

관련 정보