这可以用 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>在所有句子结束字符后添加字符。

相关内容