2014-09-20 4 views
7

Пусть говорят картина строка «Любовь»Если шаблон соответствует удалить символ новой строки в этой строке

вход

This is some text 
Love this or that 
He is running like a rabbit 

выход

This is some text 
Love this or thatHe is running like a rabbit 

Я заметил, что СЭД очень неприятно для удаление символов новой строки, любая идея?

+2

'sed' работает на одной линии за раз. Каждый раз, когда он начинает работать на линии, он удаляет новую строку и помещает ее в пространство рисунка. Образное пространство - это место, где происходит все действие. Как только подстановка выполняется, он помещает новую строку и печатает в 'STDOUT'. Чтобы удалить новую строку, вам нужно использовать 'N', которая добавляет следующую строку в пространство шаблонов, разделенную' \ n', которую вы можете удалить с заменой. –

+0

Вам нравится пространство между 'that' и' He'? – Jotne

ответ

12

Вы можете использовать это:

sed '/^Love/{N;s/\n//;}' love.txt 

детали:

/^Love/ определяет линию для лечения, если вы хотите, вы можете использовать /[Ll]ove/ вместо

N добавляет следующую строку пространство шаблонов. После этой команды шаблон пространство содержит Love this or that\nHe is running like a rabbit

s/\n// заменяет символ новой строки

+0

только скажет wow, это легко, когда объясняется, {} nececary для использования ключевого элемента N @ casimir-et-hippolyte – josifoski

+1

@josifoski: фигурные скобки заключают в себе действия, выполняемые при условии '/^Love/'истинно. –

1
$ awk '/Love/{printf "%s ",$0;next} 1' file 
This is some text 
Love this or that He is running like a rabbit 

Объяснение:

  • /Love/{printf "%s ",$0;next}

    Для строк, содержащих Love, строка печатается через printf, без перевода строки. awk затем начинается с линии next.

  • 1

    Для линий, которые не включают в себя Love, они печатаются как обычно (с новой строки). Команда 1 является криптографической записью awk для печати обычно.

+0

спасибо за решение, в каком-то будущем потребуется некоторое время, чтобы изучить awk. На данный момент am on sed в основном – josifoski

1

Через Perl,

$ perl -pe 's/^Love.*\K\n//' file 
This is some text 
Love this or thatHe is running like a rabbit 

\K отбрасывает сопоставлена ​​символы.

ИЛИ

$ perl -pe '/^Love/ && s/\n//' file 
This is some text 
Love this or thatHe is running like a rabbit 

Если строка начинается со строки Love, то он удаляет символ новой строки из этой строки.

+3

Используйте 'chomp', если нужно удалить только новую строку. 'perl -pe 'chomp if/^ Love /' file' –

2

Perl:

$ perl -pe 's/^(Love[^\n]*)\n/\1/' file.txt 
This is some text 
Love this or thatHe is running like a rabbit 

Или, если цель исключительно сосредоточены на \n вы можете chomp на основе шаблона:

$ perl -pe 'chomp if /^Love/' file.txt 
This is some text 
Love this or thatHe is running like a rabbit 
1

Вот еще один awk вариант:

awk '{ORS=(/Love/?FS:RS)}1' file 
This is some text 
Love this or that He is running like a rabbi 

Это изменение ORS на основе модели


Вот некоторые другие awk

awk '{printf "%s%s",$0,(/Love/?FS:RS)}' file 
This is some text 
Love this or that He is running like a rabbit 

Если линия имеет Love в нем используют FS в качестве разделителя, иначе использовать RS

Это должно работать также, но использовать первый.

awk '{printf "%s"(/Love/?FS:RS),$0}' file 
+0

Если вам не нравится пространство между двумя строками, используйте' awk '{ORS = (/ Love /? "": RS)} 1'' Даже это может использоваться: 'awk 'ORS = (/ Love /? FS: RS)'' – Jotne

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