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