Вопрос по shell, csh, sed – удаление символа новой строки из входящего потока с помощью sed

29

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

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

удаляет только первый символ новой строки. Я где-то нашел эту команду:

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

но он дает: & quot; ba: событие не найдено. & quot;

если я сделаю:

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

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

спасибо еще раз, это похоже на работу nav_jan
Вы не можете удалить «!», Но перед ним необходимо поставить обратную косую черту. William Pursell
@WilliamPursell Я должен использовать только csh, никаких других вариантов для меня. По вашему предложению я отказался! & quot; printf & quot; {new \ nto \ nlinux} & quot; | sed ': a; N; $ ba; s / \ n / / g' " эта команда тоже не дает правильного результата .. я знаю, что использование csh имеет много недостатков, но приходится использовать его из-за некоторого принуждения :( ..thanks nav_jan
«Ba: событие не найдено» ошибка из вашей оболочки. Прекратите использовать csh или избегайте! William Pursell
& Quot; найдено где-то & quot; вполне могли бы бытьstackoverflow.com/a/1252191/512360 - смотрите там для объяснения того, как это работает. FrankH.

Ваш Ответ

2   ответа
74

Чтобы удалить переводы строки, используйте tr:

tr -d '\n'

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

tr '\n' ' '

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

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

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

Error: User Rate Limit Exceeded$\!baError: User Rate Limit Exceededba: Event not foundError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded nav_jan
Error: User Rate Limit Exceededprintf ... | tr ...Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsed ':a;N;$!ba;s/PULLUP\n/ /g;'.
Error: User Rate Limit Exceededsed ':a;N;$\\!ba;s/\n/ /g'
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}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededpaste -sd" " -
Error: User Rate Limit Exceeded! все еще нужно сбежать.

Похожие вопросы