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