2012-05-16 2 views
28

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

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' 

удаляет только Ist новый линия знак. я где-то нашел эту команду:

printf "{new\nto\nlinux}" | sed ':a;N;$!ba;s/\n/ /g' 

но это дает: «ба: Событие не найдено.»

если я делаю:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' | sed ':a;N;s/\n/ /g' 

то это дает правильный вывод, но я ищу что-то лучше, как я не знаю, сколько нового персонажа я буду получать, когда я запустить скрипт. входящий поток от echo или printf или некоторой переменной в скрипте. Заранее спасибо

+0

В 'ба: Событие не найдено' ошибка из вашей оболочки. Прекратите использование csh или выйдите из!. –

+0

@WilliamPursell Мне нужно использовать csh только никаких других вариантов для me.on вашего предложения я упал! «printf» {new \ nto \ nlinux} "| sed ': a; N; $ ba; s/\ n// g'" эта команда тоже не дает правильный результат. Я знаю, что есть много недостатков использования csh, но нужно использовать его из-за некоторого принуждения :(..thanks –

+0

Вы не можете удалить '!', но вам нужно перед ним обратная косая черта. –

ответ

64

Для удаления новой строки, используйте Tr:

tr -d '\n' 

Если вы хотите заменить каждую строку с одним пробелом:

tr '\n' ' ' 

Ошибка ba: Event not found грядет из CSH, и связано с тем, что csh пытается сопоставить !ba в вашем списке истории. Вы можете избежать ! и написать команду:

sed ':a;N;$\!ba;s/\n/ /g' # Suitable for csh only!! 

но СЭД является неправильным инструментом для этого, и вы бы лучше использовать оболочку, которая обрабатывает строки в кавычках более разумно. То есть, прекратите использование csh и начните использовать bash.

+0

спасибо за ваш ответ, но вы можете использовать tr для изменения входящего потока из эха или printf? –

+1

tr - это фильтр. 'printf ... | tr ...' будет работать нормально. –

+0

Нет, это все еще не работает. Даже с '$ \! ba' результатом является' ba: Event not found' из сценария csh. – krb686

6

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

printf "{new\nto\nlinux}" | paste -sd' '    
{new to linux} 

или:

printf "{new\nto\nlinux}" | tr '\n' ' '    
{new to linux} 

или:

printf "{new\nto\nlinux}" |sed -e ':a' -e '$!{' -e 'N' -e 'ba' -e '}' -e 's/\n/ /g' 
{new to linux} 
+2

+1: Хорошее использование пасты. Обратите внимание, что решение sed здесь не будет работать с csh из-за (mis) правил цитирования, а '!'все равно нужно сбежать. –

+0

Yay паста. Это нужно, чтобы указать, что это должно читать из stdin: 'paste -sd" "-' – Jelle

+0

tr -d" \ n "оставляет меня только с последней строкой stdin ..:/(на Mac) –

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