Страницы

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

понедельник, 4 февраля 2019 г.

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

Как средствами shell удалить перенос строки только в том случае, если строка не пустая?
Допустим есть файл, содержащий
q w e
r t
y
Из него необходимо получить файл, содержащий
qwe
rt
y


Ответ

$ cat file | sed 's/^$/

/' | tr -d '
' | tr '
' '
'
сначала в пустые строки вставляем пару символов carriage return (0x0d,
), которые на последнем шаге заменим на символы line feed (0x0a,
).
затем удаляем все символы line feed
последний шаг: заменяем все carriage return на line feed

вместо carriage return можно использовать любой другой символ, который заведомо не встречается в исходном файле.

результирующий файл получится без завершающего символа
, что не принято у текстовых файлов. чтобы этого избежать, можно в программе для sed сразу добавлять в конце последней строки символ-подмену:
$ cat file | sed 's/^$/

/;$s/$/
/' | tr -d '
' | tr '
' '
'

обновление
в общем-то, можно обойтись только вызовом sed, без символа-подмены, и без tr, но программа для sed получается несколько громоздкой:
$ cat /tmp/file | sed -n '/^$/!H;/^$/{x;s/
//g;/^$/!s/$/
/;p};${x;s/
//g;p}'

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

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