Есть ли способ напечатать многострочный вывод (один вывод) на одной строке?
Например, если вывод:
abc
def
qwerty
Можно ли распечатать :
abcdefqwerty
Много способов. Чтобы проиллюстрировать это, я сохранил ваш пример в file
:
$ cat file | tr -d '\n'
abcdefqwerty$
$ cat file | perl -pe 's/\n//'
abcdefqwerty$
, который удаляет все символы новой строки, включая последний. Вместо этого вы можете захотеть сделать:
$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty
Вы можете удалить все вхождения символов из данного набора с помощью tr -d
. Чтобы удалить символ новой строки, используйте:
tr -d '\n'
Как всегда вы можете использовать перенаправление ввода и вывода и каналы для чтения или записи в файлы и другие процессы.
Если вы хотите сохранить последний символ новой строки, вы можете просто добавить его обратно с помощью echo
или printf '\n'
, e. g.:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
Также your_command | paste -sd ''
, который сохраняет завершающий перевод строки.
Можно передать многострочный вывод по каналу через awk
awk '{printf "%s",$0} END {print ""}'
или используйте sed
:
sed ':a;N;$!ba;s/\n//g'
$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'
1234
Дальнейшее чтение: удалите разрыв строки с помощью AWK · serverfault. SE
Использование только оболочки:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
Этот ответ имеет решение проблемы, которую вы пытаетесь создать: Почему bash удаляет \ n в $ (cat file)?
Если вы введете cat myfile.txt
, вы будете см .:
abc
def
ghi
Но если вы введете echo $(cat myfile.txt)
, вы увидите:
abc def ghi
Обратите внимание, что этот метод вставляет пробел, где раньше были отдельные новые строки. Это делает вывод более легким для чтения, но не строго соответствует объему вашего вопроса.
Если вы используете Bash, то вы можете сделать это без какого-либо внешнего инструмента.
x=($(echo line1; echo line2))
echo "${x[@]}"
Результат:
line1 line2
Первая команда превращает многострочный вывод в массив, вторая команда расширяет массив до нескольких аргументов в одной строке.
Если вы хотите использовать Perl для этого, вы можете использовать его функцию chomp
:
perl -pe chomp
Вы можете передать одно или несколько имен файлов в качестве последующих аргументов.
perl -pe chomp file1 file2 file3
В некоторых случаях вы можете не захотеть делать это , но вместо этого вы можете направить или перенаправить эту команду. (Эти способности - и это предостережение - все применимы и к любому другому решению на основе perl -p
или perl -n
.)
Итак, если вы хотите обработать вывод из запуска some-command
:
some-command | perl -pe chomp
Это потенциально быстрее, чем команда Perl в ответе Тердона . Символы новой строки (представленные \n
) появляются только в конце строк в этой ситуации - потому что именно они используются Perl, чтобы решить, где заканчивается каждая строка. s/\n//
просматривает по всей строке новые строки, в то время как chomp
просто удаляет один в конце (если есть, так как самая последняя строка может иметь или не иметь его).
Производительность, возможно, не является главной причиной предпочтения chomp
. Команда perl
в ответе terdon будет только немного медленнее, если вы не обрабатываете огромный файл с очень длинными строками. И если вам нужна скорость, путь Дэвида Фёрстера все еще, вероятно, быстрее. chomp
, однако, является именно тем инструментом, которым вы пользуетесь, если вы используете Perl, и я думаю, что цель chomp
яснее, чем цель s/\n//
. В конечном счете, вероятно, нет объективного ответа о том, какой из них лучше.
Тем не менее, я рекомендую не использовать подстановку команд ($(
)
) только для того, чтобы обеспечить вывод завершающего символа новой строки. Если текст, который вы обрабатываете, не будет коротким, он, вероятно, будет довольно медленным - он должен собрать весь текст сразу, а затем распечатать его - и это затруднит понимание вашей команды. Вместо этого вы можете сделать , как предложил Дэвид Фёрстер , и запустить echo
или printf '\n'
впоследствии.
perl -pe chomp; echo
Если вы передаете из или (как показывает Дэвид Фёрстер) перенаправление из этой команды, то вы можете заключить ее в {
;}
так, чтобы вывод обеих команд взят вместе. Если вы просто распечатываете его в терминал, вы можете запустить его точно так, как показано выше. Это работает, даже если вы отправляете команду на или перенаправляете команду, потому что echo
/ printf '\n'
на самом деле не читает никаких входных данных. То есть это работает:
some-command | perl -pe chomp; echo
В то время как здесь вы не можете просто удалить {
;}
:
{ perl -pe chomp; echo; } | some-other-command
Или, если хотите, вы можете сделать perl
напечатать последнюю строку. Подобно включению команд perl
и echo
в {
;}
, этот подход работает, даже если вы отправляете или перенаправляете из его (и, как все подходы ) , это работает, когда вы отправляете в это тоже):
perl -wpe 'chomp; END { print "\n" }'
Обратите внимание, что команда в ответе Тердона также отлично работает с этими методами печати последней новой строки. Например:
perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'