Подтвердить что ты не робот

Удаление нового символа линии из входящего потока с помощью sed

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

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

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

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

но он дает: "ba: Событие не найдено."

если я делаю:

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

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

4b9b3361

Ответ 1

Чтобы удалить новые строки, используйте 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.

Ответ 2

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

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}