sed를 사용하여 이 작업을 수행할 수 있습니까?

sed를 사용하여 이 작업을 수행할 수 있습니까?

나는 일부 텍스트 처리를 수행하기 위해 간단한 Python 프로그램을 작성했습니다. sed를 사용하여 연극/무대 연극의 텍스트를 입력으로 사용하여 문장을 줄로 나누고 싶습니다. sed를 사용하여 작성해 보았으나 실패했습니다. sed로 할 수 있는지 알고 싶습니다.


    import re
    
    test_txt = """
    Brigitte:
    Ich hoffe, du hast während des Lockdowns nicht alle Benimmregeln vergessen.
    Bernd:
    Entschuldige bitte. Das muss an der Vorfreude liegen. Endlich wieder kann ich meinen
    Cappuccino im Sitzen genießen und muss ihn nicht heimlich aus einem Pappbecher in
    irgendeiner Nische in der Fußgängerzone trinken. Wie nervig das war, Maske runter,
    einen Schluck trinken, Maske wieder auf, und immer die Gegend im Blick haben, damit ich
    die Leute vom Ordnungsamt rechtzeitig sehe.
    Brigitte:
    Das ist mal wieder typisch. Du denkst nur an dich und lässt dabei das Wesentliche aus
    den Augen.
    Bernd:
    Häh?
    (Fesnik erscheint, bringt die Karten)
    Fesnik:
    Herzlich willkommen im Adria, schön, dass sie bei uns sind.
    Bernd:
    Ich habe Ihren Cappuccino wirklich vermisst.
    Brigitte:
    Wir hatten schon Angst, dass Sie nicht wieder aufmachen.
    Fesnik:
    Eine unbegründete Sorge, Signorina.
    (Fesnik ab, Bernd und Brigitte studieren die Karten)
    Brigitte:
    Signorina heißt Fräulein, wusstest du das eigentlich? Typisch Italiener, schleimen uns
    """
    
        actor_pattern = '.+:'
        lines = test_txt.splitlines()
        speech = ''
        i = 0
        while i < len(lines):
            if re.match(actor_pattern, lines[i]):
                while True:
                    speech += lines[i].replace('\n', ' ').replace(
                        '. ', '.\n').replace(
                        '? ', '?\n').replace(
                        '! ', '!\n').replace(
                        ') ', ')\n')
                    i += 1
                    if not i < len(lines):
                        break
                    if re.match(actor_pattern, lines[i]):
                        print('')
                        break
            else:
                i += 1
            print(speech, end='')
            speech = ''
        print('\nEND')

출력은 다음과 같습니다.

Brigitte:Ich hoffe, du hast während des Lockdowns nicht alle Benimmregeln vergessen.
Bernd:Entschuldige bitte.
Das muss an der Vorfreude liegen.
Endlich wieder kann ich meinenCappuccino im Sitzen genießen und muss ihn nicht heimlich aus einem Pappbecher inirgendeiner Nische in der Fußgängerzone trinken.
Wie nervig das war, Maske runter,einen Schluck trinken, Maske wieder auf, und immer die Gegend im Blick haben, damit ichdie Leute vom Ordnungsamt rechtzeitig sehe.
Brigitte:Das ist mal wieder typisch.
Du denkst nur an dich und lässt dabei das Wesentliche ausden Augen.
Bernd:Häh?(Fesnik erscheint, bringt die Karten)
Fesnik:Herzlich willkommen im Adria, schön, dass sie bei uns sind.
Bernd:Ich habe Ihren Cappuccino wirklich vermisst.
Brigitte:Wir hatten schon Angst, dass Sie nicht wieder aufmachen.
Fesnik:Eine unbegründete Sorge, Signorina.(Fesnik ab, Bernd und Brigitte studieren die Karten)
Brigitte:Signorina heißt Fräulein, wusstest du das eigentlich?
Typisch Italiener, schleimen uns
END

코드는 actor_pattern을 찾아 다음 줄로 연결한 다음 다른 actor_pattern을 찾을 때까지 각 문장을 새 줄로 나눈 다음 이런 방식으로 줄을 계속 진행합니다.

답변1

"actor_pattern"이 무엇인지, 사용법이 무엇인지 잘 모르겠습니다. 이 간단한 일이 얼마나 멀리 갈 수 있습니까 sed? 원하는 결과에 매우 가깝지만 몇 가지 개선이 필요할 수 있습니다.

sed -Ez 's/\n/ /g; s/([.?!)]) ([^(])/\1\n\2/g' file
Brigitte: Ich hoffe, du hast während des Lockdowns nicht alle Benimmregeln vergessen.
Bernd: Entschuldige bitte.
Das muss an der Vorfreude liegen.
Endlich wieder kann ich meinen Cappuccino im Sitzen genießen und muss ihn nicht heimlich aus einem Pappbecher in irgendeiner Nische in der Fußgängerzone trinken.
Wie nervig das war, Maske runter, einen Schluck trinken, Maske wieder auf, und immer die Gegend im Blick haben, damit ich die Leute vom Ordnungsamt rechtzeitig sehe.
Brigitte: Das ist mal wieder typisch.
Du denkst nur an dich und lässt dabei das Wesentliche aus den Augen.
Bernd: Häh? (Fesnik erscheint, bringt die Karten)
Fesnik: Herzlich willkommen im Adria, schön, dass sie bei uns sind.
Bernd: Ich habe Ihren Cappuccino wirklich vermisst.
Brigitte: Wir hatten schon Angst, dass Sie nicht wieder aufmachen.
Fesnik: Eine unbegründete Sorge, Signorina. (Fesnik ab, Bernd und Brigitte studieren die Karten)
Brigitte: Signorina heißt Fräulein, wusstest du das eigentlich?
Typisch Italiener, schleimen uns 

sed버전은 (GNU sed) 4.7입니다. 스크립트는 이 -z옵션(일부 버전에서는 사용할 수 없음)을 사용하여 전체 텍스트를 메모리로 읽은 다음 <NL>모든 문자를 공백으로 바꾸어 하나의 긴 줄을 형성한 다음 <NL>모든 문장 끝 문자 뒤에 문자를 추가합니다.

관련 정보