sed с новой строкой и "

У меня есть куча текстовых файлов, которые выглядят так:

His doctor attributed this to an allergy .

That hardly convinced him , as he had no history of allergies of any kind .
" Yet , that was to be the least of his problems .
I may have to take steroids for the rest of my life .
"
A topical steroid spray was later added to his repertoire of drugs and 
" he knew it was merely masking the underlying condition .
"

И я хочу изменить его так, чтобы . " были в одной строке. Желаемый результат должен выглядеть так:

His doctor attributed this to an allergy .

That hardly convinced him , as he had no history of allergies of any kind .
" Yet , that was to be the least of his problems .
I may have to take steroids for the rest of my life . "
A topical steroid spray was later added to his repertoire of drugs and 
" he knew it was merely masking the underlying condition . "

Я пробовал это, но это не работает:

sed -i 's/.\n"\n/. "\n/g'

Может ли кто-нибудь помочь мне с правильной командой sed, чтобы сдвинуть " вверх?


person alvas    schedule 25.04.2012    source источник
comment
Причина, по которой это не работает, заключается в том, что sed работает над строками отдельно.   -  person Lev Levitsky    schedule 25.04.2012
comment
так есть ли какой-нибудь другой способ решить эту проблему?   -  person alvas    schedule 25.04.2012
comment
Это заставит подняться вторую строку с. Вы не можете явно искать новые строки. Теперь следующий шаг - избавиться от цитаты и соединить две строки. При попытке заменить или найти \ n используйте вместо этого $. Вот что будет обрабатывать обе линии непрерывно. Я видел решение perl, и это может быть хорошим вариантом. sed -e '/\.$/ {N // p}' test.txt Между N и // p} есть разрыв строки.   -  person octopusgrabbus    schedule 25.04.2012


Ответы (4)


Вот что я понял:

sed -n '1{h;d};/^"$/{g;s/$/ "/p;n;h;d};x;p;${g;p}' input.txt

выход

His doctor attributed this to an allergy .

That hardly convinced him , as he had no history of allergies of any kind .
" Yet , that was to be the least of his problems .
I may have to take steroids for the rest of my life . "
A topical steroid spray was later added to his repertoire of drugs and
" he knew it was merely masking the underlying condition . "
person kev    schedule 25.04.2012
comment
но мне нужно сохранить остальную часть \ n, только те, что с \ n должны быть усечены. - person alvas; 25.04.2012
comment
спасибо творит чудеса !! но почему это работает? и зачем ему такое сложное регулярное выражение? - person alvas; 25.04.2012
comment
Прямо как программирование на ассемблере. Вы должны отслеживать каждый крошечный шаг. - person kev; 25.04.2012
comment
h;d;g;x;p - это sed команда. Вы можете ввести man sed, чтобы узнать о них больше. - person kev; 25.04.2012
comment
И еще одна проблема, как мне выполнить sed и написать его для группы файлов? раньше я использовал sed -i ... * для изменения регулярного выражения в моих txt-файлах. -n отображает только текст -i с вашим регулярным выражением, только записывает испорченные txt-файлы. - person alvas; 25.04.2012
comment
Попробуйте sed -in '...' *.txt. Я предлагаю вам сделать резервную копию ваших файлов перед запуском. - person kev; 25.04.2012
comment
sed -in ... * повторил строки из-за -n, может быть, я просто напишу сценарий bash для записи каждого файла. знак равно - person alvas; 25.04.2012

perl -00 -lpe 's/\n"$/"/mg'

производит желаемый результат.

person glenn jackman    schedule 25.04.2012

Немного другой вариант sed:

sed -n '1{h};1!{/"$/!H};/"$/{H;g;s/\.[ \n]*"$/\. "/;p;n;x}' input.txt
  • 1 { h } - поместить первую строку в буфер хранения
  • 1! { /"$/ !H } - для остальных строк накапливается в буфер удержания, если нет одиночных "
  • /"$/ { H; g; s/\.[ \n]*"$/\. "/; p; n; x } - иначе:

    1. H — add to the hold buffer
    2. g - переместить буфер удержания в пространство шаблонов
    3. s/\.[ \n]*"$/\. "/ - сделать замену
    4. p - распечатать
    5. n - прочитать следующую строку
    6. x - и сохранить в буфере блокировки
person vyegorov    schedule 25.04.2012

Это может сработать для вас:

sed ':a;$!N;s/\.\n"/."/;P;D' /tmp/a
His doctor attributed this to an allergy .

That hardly convinced him , as he had no history of allergies of any kind ." Yet , that  was to be the least of his problems .
I may have to take steroids for the rest of my life ."
A topical steroid spray was later added to his repertoire of drugs and 
" he knew it was merely masking the underlying condition ."
person potong    schedule 26.04.2012