Можно рассматривать файл как одну строку, а затем заменять только новые строки, за которыми следуют два новых строки. Это решение предполагает наличие непустых строк.
bash-4.1$ cat input
duck
duck
duck
-- goose
bash-4.1$ perl -0777 -ple 's/\n(?=[^\n]+\n[^\n]+\n)/ /g' input
duck duck duck
-- goose
bash-4.1$
Другим решением было бы объединить строки в массив строк в памяти, а затем объединить этот массив с пробелами, за исключением последней строки, или подсчитать количество строк вначале, а затем с помощью этого числа определить, когда новую строку следует преобразовать в пробел или оставить в покое.
После прочтения комментария Centimane к /var/run/utmp
и поиска по-разному, я нашел эту ветку форума Fedora , в которой упоминалось, что проблема вызвана ошибкой в GDM, которая создает неверную запись в /var/run/utmp
. В конце концов я даже нашел отчет об ошибке для него и еще один здесь .
Похоже, что ваш неизвестный пользователь — gdm
и who
почему-то не может его интерпретировать.