Есть ли способ напечатать многострочный вывод (один вывод) на одной строке?
Например, если вывод:
abc
def
qwerty
Можно ли распечатать:
abcdefqwerty
command-line
scripts
text-processing
Шринидхи Кулкарни
источник
источник
printf
+cat
+perl
комбо намного лучше обрабатывается с помощьюperl -pe 's/\n//;END{printf "\n"}' input.txt
одного процесса, без подстановки команд и работы с кавычками, а также без UUOC. Может быть.Вы можете передать свой многострочный выход через
awk
или используйте
sed
:Пример запуска
Дальнейшее чтение: удалить разрыв строки, используя AWK · serverfault.SE
источник
Также,
your_command | paste -sd ''
который сохраняет завершающий перевод строки.источник
Если вы хотите использовать Perl для этого, вы можете использовать его
chomp
функцию:Еще несколько подробностей, для тех, кому интересно.
Вы можете передать одно или несколько имен файлов в качестве последующих аргументов.
В некоторых случаях вы можете этого не делать , но вместо этого вы можете направить или перенаправить на эту команду. (Эти способности - и это предостережение - все применимы и к любому другому
perl -p
илиperl -n
основанному решению).Итак, если вы хотите обработать вывод из работы
some-command
:Это потенциально быстрее, чем команда Perl в ответе Тердона . Символы новой
\n
строки (представленные ) появляются только в конце строк в этой ситуации - потому что именно они используются Perl, чтобы решить, где заканчивается каждая строка.s/\n//
просматривает всю строку на наличие новых строк, в то время какchomp
просто удаляет строку в конце (если есть, так как последняя строка может иметь или не иметь ее).Производительность не может быть главной причиной предпочтения
chomp
. Командаperl
в ответе Тердона будет только немного медленнее, если вы не обрабатываете огромный файл с очень длинными строками. И если вам нужна скорость, путь Дэвида Фёрстера все еще, вероятно, быстрее.chomp
однако, это именно тот инструмент, который вам подходит, если вы используете Perl, и я думаю, что цельchomp
более ясна, чем цельs/\n//
. В конечном счете, вероятно, нет объективного ответа о том, что лучше.Печать последней строки.
Тем не менее, я рекомендую не использовать команду substitution (
$(
)
) только для того, чтобы печатать завершающий символ новой строки. Если текст, который вы обрабатываете, не будет коротким, он, вероятно, будет довольно медленным - он должен собрать весь текст сразу, а затем распечатать его - и это затруднит понимание вашей команды. Вместо этого вы можете сделать, как предложил Дэвид Фёрстер, и бежать,echo
илиprintf '\n'
после.Если вы работаете с или (как показывает Дэвид Фёрстер) перенаправление с этой команды, то вы можете заключить ее
{
;}
так, чтобы выходные данные обеих команд были взяты вместе. Если вы просто распечатываете его в терминал, вы можете запустить его точно так, как показано выше. Это работает , даже если вы трубопроводы или перенаправлять к команде, потому чтоecho
/printf '\n'
фактически не требует никакого ввода. То есть это работает:Хотя здесь вы не можете просто удалить
{
;}
:Или, если вы предпочитаете, вы можете
perl
распечатать окончательный перевод новой строки. Как заключениperl
иecho
команды в{
;}
этом подходе работает , даже если вы трубопроводы или перенаправление от него (и, как всех подходы, это работает , когда вы трубопроводы к ним, тоже):Обратите внимание, что команда в ответе Тердона прекрасно работает и с этими способами печати последней строки. Например:
источник
perl -wpe 'chomp; END { print "\n" }
это тот же процесс, незначительное преимущество перед добавлением конечного эхаИспользуя только оболочку:
источник
Этот ответ имеет решение проблемы, которую вы пытаетесь создать: почему bash удаляет \ n в $ (файл cat)?
Если вы напечатаете,
cat myfile.txt
вы увидите:Но если вы напечатаете,
echo $(cat myfile.txt)
вы увидите:Обратите внимание, этот метод вставляет пробел, где раньше были отдельные новые строки. Это облегчает чтение результатов, но не строго соответствует объему вашего вопроса.
источник
Если вы используете Bash, то вы можете сделать это без каких-либо внешних инструментов.
Результат:
Первая команда превращает многострочный вывод в массив, вторая команда расширяет массив до нескольких аргументов в одной строке.
источник