Удаление нового символа линии из входящего потока с помощью 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.
Спасибо заранее
Ответы
Ответ 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}