Удалить предыдущие строки, затем присоединиться, когда SED найдет выражение - PullRequest
2 голосов
/ 15 января 2010

Я пытаюсь объединить предложения в документе, но некоторые предложения разбиты на части с пустой строкой между ними.Например:

Собака погналась за мячом

, брошенным ее владельцем.

Мяч прошел довольно далеко.

to:

Собака преследовала мяч, брошенный ее владельцем.

Мяч прошел довольно далеко.

Я думалЯ мог бы искать пустую строку и затем начало следующей строки для символа нижнего регистра.Он копирует эту строку, удаляет ее и пустую строку над ней, а затем добавляет скопированное предложение к другому ломаному предложению (извините за путаницу).

Я новичок в sed и попробовал его с этой командой:

sed "/$/{:a;N;s/\n\(^[a-z]* .*\)/ \1/;ba}"

Но делает это только один раз и удаляет только пустую строку, не добавляя вторую часть разбитого предложения к первой части.

Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 16 января 2010

Это должно сработать:

sed ':a;$!{N;N};s/\n\n\([a-z]\)/ \1/;ta;P;D' sentences
0 голосов
/ 16 января 2010

если у вас есть Python, можете попробовать этот фрагмент

import string
f=0
data=open("file").readlines()
alen=len(data)
for n,line in enumerate(data):
    if line[0] in string.uppercase:
        found_upper=n
        f=1
    if f and line[0] in string.lowercase:
        data[found_upper] = data[found_upper].strip() + " " + line
        data[n]=""
    if n+1==alen:
        if line[0] in string.lowercase:
            data[found_upper] = data[found_upper].strip() + " " + line
            data[n]=""
        else : data[n]=line

вывод (добавлено больше сценариев вашего формата файла)

$  cat file    
the start
THE START
The dog chased after a ball
that was thrown by its owner.

My ball travelled quite far




and it smashed the windows
but it didn't cause much damage


THE END
THE FINAL DESTINATION
final
FINAL DESTINATION LAST EPISODE
the final final

$ ./python.py
the start
THE START
The dog chased after a ball that was thrown by its owner.

My ball travelled quite far and it smashed the windows but it didn't cause much damage






THE END
THE FINAL DESTINATION final
FINAL DESTINATION LAST EPISODE the final final the final final
0 голосов
/ 16 января 2010

Впервые я использовал sed для выполнения таких сложных замен. У меня ушло около 2 часов, чтобы придумать что-нибудь: D

Я использовал GNU sed, так как мне не удавалось работать с ветвями на моем mac в одной строке.

Вот входной контент, который я использовал для тестирования:

The dog chased after a ball

that was thrown by its owner.

The ball

travelled quite far.
I took me a while to fix this file.
And now it's

working :)

Тогда вот командная строка sed, которую я придумал:

$ sed -n '/^$/!bstore;/^$/N;s/\n\([a-z]\)/ \1/;tmerge;h;d;:store;H;b;:merge;H;g;s/\n \([a-z]\)/ \1/;p;s/.*//g;h;d' sentences.txt

А вот и вывод:

$ sed -n '/^$/!bstore;/^$/N;s/\n\([a-z]\)/ \1/;tmerge;h;d;:store;H;b;:merge;H;g;s/\n \([a-z]\)/ \1/;p;s/.*//g;h;d' sentences.txt

The dog chased after a ball that was thrown by its owner.

The ball travelled quite far.

I took me a while to fix this file.
And now it's working :)

Вы можете заметить, что в самом начале вставлена ​​пустая строка, но я думаю, что с этим можно жить. Пожалуйста, ребята, прокомментируйте это, если вы овладеваете sed, так как это просто новичок.

...