Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Удалить перенос строки, если строка не пустая

#linux #shell


Как средствами shell удалить перенос строки только в том случае, если строка не пустая?

Допустим есть файл, содержащий

q
w
e

r
t

y


Из него необходимо получить файл, содержащий

qwe

rt

y

    


Ответы

Ответ 1



$ cat file | sed 's/^$/\r\r/' | tr -d '\n' | tr '\r' '\n' сначала в пустые строки вставляем пару символов carriage return (0x0d, \r), которые на последнем шаге заменим на символы line feed (0x0a, \n). затем удаляем все символы line feed. последний шаг: заменяем все carriage return на line feed. вместо carriage return можно использовать любой другой символ, который заведомо не встречается в исходном файле. результирующий файл получится без завершающего символа \n, что не принято у текстовых файлов. чтобы этого избежать, можно в программе для sed сразу добавлять в конце последней строки символ-подмену: $ cat file | sed 's/^$/\r\r/;$s/$/\r/' | tr -d '\n' | tr '\r' '\n' обновление в общем-то, можно обойтись только вызовом sed, без символа-подмены, и без tr, но программа для sed получается несколько громоздкой: $ cat /tmp/file | sed -n '/^$/!H;/^$/{x;s/\n//g;/^$/!s/$/\n/;p};${x;s/\n//g;p}'

Ответ 2



Вариант на perl: perl -0pe 's/\N\K\n(?!\n|$)//g;' test.txt

Ответ 3



Выводим содержимое файла | не выводим начало-конец строк (пустые) | удаляем unix-перенос строки. cat file | grep -v ^$ | tr -d '\n'

Комментариев нет:

Отправить комментарий