2010-01-15 5 views
2

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

Пес погнался за мячом

, который был брошен своим владельцем.

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

к:

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

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

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

Я новичок в СЭД и попробовал с помощью этой команды:

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

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

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

ответ

1

Это должно сделать трюк:

sed ':a;$!{N;N};s/\n\n\([a-z]\)/ \1/;ta;P;D' sentences 
+0

+1, выглядит намного лучше, я думал, что не могу обойтись без пространства для удержания - по крайней мере, я пробовал :) –

+0

Спасибо большое всем! :) Я тестировал простой текстовый документ gedit, в котором есть текст, и по какой-то причине это не сработало, но пример, который я дал ранее с предложением собаки, сделал. Причиной этого было то, что некоторые из строк имели \ r \ n (возврат каретки + новая строка). Мне просто нужно было удалить все, и все получилось. – 2010-01-18 14:28:32

0

Впервые я использовал 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 :) 

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

+0

На вашем Mac вы можете попробовать разбить скрипт 'sed' на несколько частей' -e'. Некоторые версии 'sed' требуют этого. –

0

если у вас есть 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