일치할 때까지 파일에서 세 줄을 삭제합니다.

일치할 때까지 파일에서 세 줄을 삭제합니다.
982
01:25:09,473 --> 01:25:10,978
Stay with me.

983
01:25:09,473 --> 01:25:10,978
Stay with me.

984
01:25:15,390 --> 01:25:18,484
( MAJESTIC MUSIC )

984다음 세 줄 (포함) 을 삭제하고 싶습니다 . 나는 이것을 시도했지만 작동하지 않습니다.

perl -0777 -pe 's/.*\n.*\n\(.*\)//'

답변1

상대 주소를 이해하는 a를 사용하십시오 sed(비표준이지만 일반적으로 지원됨).

$ sed '/^984$/,+2d' input_file
982
01:25:09,473 --> 01:25:10,978
Stay with me.

983
01:25:09,473 --> 01:25:10,978
Stay with me.

또는 다음을 사용하여 sed:

sed '/^984$/{$!N;$!N;d;}' input_file

즉, 일치 항목에서 N다음 두 줄(있는 경우)을 추가하고 d둘 다 제거합니다.

답변2

이와 같이:

단락 모드에서:

$ perl -00 -ne 'print unless /^984\b/' file

한 줄씩:

$ perl -anE 'if ($F[0] == 984) { last } else { print }' file

정규식을 사용하여 전체 파일을 구문 분석합니다.

$ perl -0777 -ne 'print $& if /.*(?=\n^984)/ms' file
$ perl -gne 'print $& if /.*(?=\n^984)/ms' file # perl >= 5.36

산출

983
01:25:09,473 --> 01:25:10,978
Stay with me.

1 정규식 매칭은 다음과 같습니다.

정규식 설명하다
.* 0개 이상의 문자와 일치합니다.
(?= 긍정적인 전달 주장
\n 개행 문자 일치
^ 문자열의 시작과 일치합니다.
984) 4개의 문자를 일치시키고 984미리보기를 끕니다.

답변3

RS=<null>단락 모드의 awk 사용(입력 레코드가 빈 줄로 구분될 때 활성화 및 사용됨):

$ awk -v RS= -v ORS='\n\n' '$1 != 984' file
982
01:25:09,473 --> 01:25:10,978
Stay with me.

983
01:25:09,473 --> 01:25:10,978
Stay with me.

어떤 이유로 인해 단락 모드를 사용할 수 없고(예를 들어 레코드 사이의 빈 줄에 실제로는 볼 수 없는 인쇄할 수 없는 문자가 포함되어 있음) 해당 지점에서 시작하는 4줄을 삭제하려는 경우 다음을 984수행할 수 있습니다. 이것은 (그러나 덜 견고합니다. 아래를 참조하십시오):

$ awk '$1 == "984"{c=4} !(c&&c--)' file
982
01:25:09,473 --> 01:25:10,978
Stay with me.

983
01:25:09,473 --> 01:25:10,978
Stay with me.

바라보다인쇄를 위해 sed- 또는 awk-a-line-follow-a-matching-pattern을 사용하십시오.관련 awk 관용구.

첫 번째 스크립트는 첫 번째 빈 줄 다음에 오는 984에만 일치하므로 가장 강력합니다. 다음 상황을 포함해야 합니다.

950
01:25:09,473 --> 01:25:10,984
this is bad

951
01:25:09,473 --> 01:25:10,978
984 here is also bad

9841
01:25:09,473 --> 01:25:10,978
this is also bad

입력/출력 예제에서 레코드의 첫 번째 줄 대신 세 번째 줄에서 잘못 일치하는 스크립트를 정리하거나 대상 번호에서 정확히 일치하는 대신 부분 일치를 수행합니다.

답변4

사용행복하다(이전 Perl_6)

~$ raku -ne '.put unless /^ 984 $/ fff *.chars == 0 ;'  file

#OR

~$ raku -ne '.put unless /^ 984 $/ fff {.chars == 0} ;'  file

위의 코드는 빈 줄( 0과 같음)로 시작하고 끝나는 레코드를 fff감지하는 Raku의 "트리거" 연산자를 사용합니다. 위의 코드는 빈 줄을 감지하려고 시도하지 않습니다.984.chars앞으로 984.

입력 예:

982
01:25:09,473 --> 01:25:10,978
Stay with me.

983
01:25:09,473 --> 01:25:10,978
Stay with me.

984
01:25:15,390 --> 01:25:18,484
( MAJESTIC MUSIC )

985
01:25:18,485 --> 01:25:18,500
( END CREDITS )

출력 예(1):

982
01:25:09,473 --> 01:25:10,978
Stay with me.

983
01:25:09,473 --> 01:25:10,978
Stay with me.

985
01:25:18,485 --> 01:25:18,500
( END CREDITS )

Raku는 fff반환 시 두 개의 식별 시퀀스 중 하나 또는 둘 다를 남기는 다양한 변형을 제공합니다. 그것들은 ^fff또는 fff^또는 입니다 ^fff^. 이렇게 하면 미리보기/뒤돌아보기를 사용할 필요성이 줄어듭니다. 예를 들어, fff위의 코드를 다음과 같이 변경 하면 ^fff^다음과 같은 결과를 얻을 수 있습니다 .

출력 예(2):

982
01:25:09,473 --> 01:25:10,978
Stay with me.

983
01:25:09,473 --> 01:25:10,978
Stay with me.

984

985
01:25:18,485 --> 01:25:18,500
( END CREDITS )

먼저 레코드를 분리하고 싶거나 필요하다면 slurp파일을 한꺼번에 병합하고 \n\n연속된 개행 문자로 간단히 분할하세요. 나머지 코드는 다음과 같이 단순화되지만 불행히도 파일 끝에 두 개의 빈 줄이 추가됩니다.

~$ raku -e 'for slurp.split("\n\n") { put $_ ~ "\n"  unless /^984 / };' file

걱정하지 마세요. Raku를 사용하여 파일의 시작/끝에서 빈 줄을 제거하려면 아래 첫 번째 링크를 참조하세요.

https://unix.stackexchange.com/a/725227/227738
https://docs.raku.org
https://raku.org

관련 정보