(패턴 범위 내에서) 문자열의 처음 7개 항목에 해당하는 줄을 삭제합니다.

(패턴 범위 내에서) 문자열의 처음 7개 항목에 해당하는 줄을 삭제합니다.

txt 파일의 패턴 범위(string1-string2)에서 문자열의 처음 7개 항목에 해당하는 줄을 제거해야 합니다.

txt 파일 콘텐츠 예:

whatever
xpto string1 foo2
whatever1 
string2
xpto1 another_foo
xpto string2

string2 foo1

whatever
string2 another_xpto
string2 string2
foo xpto string2 whatever 
anything else foo string2
xpto
string2
foo whatever

다음과 같은 sed 범위의 솔루션이 필요합니다.

sed '/string1/,/string2/d' 파일.txt

/string2/요점은 string2의 일곱 번째 일치 항목에 해당하는 줄로 확장하는 방법을 모른다는 것입니다 . 이상적인 출력은 다음과 같아야 합니다.

whatever
anything else foo string2
xpto
string2
foo whatever

답변1

sed -e:t -e'/string1/!b' -e'/\(.*string2\)\{7\}/d;N;bt'

답변2

awk '/string1/{c=7}; c<1; {c-=gsub(/string2/, "&")}' file

cstring1처음에는 0이고, 발견되면 7로 설정됩니다. 이 줄은 매번 인쇄됩니다 c<1.

이 함수는 gsub각 행의 발생 횟수를 반환합니다. string2카운터는 c이 값만큼 감소됩니다.

답변3

리터럴 문자열을 사용하여 원하는 작업을 수행하는 한 가지 방법은 다음과 같습니다.

$ cat tst.awk
BEGIN { lgth = length(end) }
index($0,beg) { inBlock = 1 }
inBlock {
    rec = $0
    while ( pos = index(rec,end) ) {
        if ( ++cnt >= min ) {
            inBlock = 0
        }
        rec = substr(rec,pos+lgth)
    }
    next
}
{ print }

$ awk -v beg='string1' -v end='string2' -v min=7 -f tst.awk file
whatever
anything else foo string2
xpto
string2
foo whatever

위에서는 문자열의 백슬래시(예: \t탭이 됨)에 대해 설명합니다. 문제가 발생하면 쉽게 해결할 수 있으므로 알려주시기 바랍니다 ENVIRON[].

답변4

진주

perl -ne '
  if (my $e = /string1/ ... s/string2/$&/g >= 7) {
      $_ .= $e =~ /E0/ ? next : <>, redo;
  }
  print;
' file

POSIX sed:

sed -ne '
  /string1/!{p;d;}
  :loop
    n
    /string2/H
    g;s//&/7;t
  b loop
' file

산출:

whatever
anything else foo string2
xpto
string2
foo whatever

관련 정보