2014-10-04 3 views
0

У меня есть ряд строк из истории, которые были обернутый:Если строка начинается с определенным символом, удалить предыдущую строку

Little Sue went 
out to play, and 
found herself a log. 
The log was 
heavy. 

Я хотел бы разворачивать текст. Если строка начинается со строчной буквы, то предыдущий символ новой строки должны быть удалены, и заменены пробелами, с этим конечным результатом:

Little Sue went out to play, and found herself a log. 
The log was heavy. 

Я нашел несколько примеров СЭД делает шаблон согласования по новой строки, но они всегда для удаления новой строки после соответствие шаблону. Я попытался создать некоторые команды в sed, но он работает не совсем правильно. Кажется, они действуют только на каждой другой линии. Я думаю, это потому, что sed заканчивает пару строк, печатает их, а затем бросает их, прежде чем потреблять следующие строки.

sed 'N;/\n[a-z]/s/\n/ /;P;D' wrapped.txt 
    Little Sue went out to play, and 
    found herself a log. 
    The log was heavy. 
sed 'N;/\n[a-z]/s/\n\([a-z]\)/ \1/' wrapped.txt 
    Little Sue went out to play, and 
    found herself a log. 
    The log was 
    heavy. 

У меня есть GNU sed 4.2.2 на моей машине Fedora 20. Кто-нибудь знает, способен ли sed на то, что я хочу? Или, если sed не будет делать, то любая программа или язык, общий для ящиков Linux, будет в порядке.

+1

В своем первом SED растворе вы почти там! Однако помните, что после удаления новой строки пространство шаблонов после печати будет полностью удалено, и, следовательно, обработка начнется снова со следующей строки. Чтобы восстановить пространство шаблонов на две строки, вам нужно вернуться к началу, т. Е. ': A; N;/\ n [az]/s/\ n//; ta; P; D', тем самым предотвращая команды из переработка. – potong

ответ

1

Это можно легко сделать с помощью Perl,

$ perl -00pe 's/\n(?=[a-z])/ /g' file 
Little Sue went out to play, and found herself a log. 
The log was heavy. 
+1

Это действительно работает, спасибо. Кроме того, позже я нашел [этот вопрос] (http://stackoverflow.com/questions/2208059/using-awk-or-sed-to-remove-newlines-based-on-first-character-of-nextline), и один из ответов помог мне построить это, в котором используется более основное (в моем эксперименте) регулярное выражение: 'perl -0pe 's/\ n ([az])/\ 1/g' file' – pgn674

Смежные вопросы