Как средствами 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}'
Комментариев нет:
Отправить комментарий