Как я могу напечатать многострочный вывод на одной строке?

Есть ли способ напечатать многострочный вывод (один вывод) на одной строке?

Например, если вывод:

abc
def
qwerty

Можно ли распечатать :

abcdefqwerty 
15
задан 22 December 2017 в 21:24

8 ответов

Много способов. Чтобы проиллюстрировать это, я сохранил ваш пример в 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
10
ответ дан 22 December 2017 в 21:24

Вы можете удалить все вхождения символов из данного набора с помощью tr -d. Чтобы удалить символ новой строки, используйте:

tr -d '\n'

Как всегда вы можете использовать перенаправление ввода и вывода и каналы для чтения или записи в файлы и другие процессы.

Если вы хотите сохранить последний символ новой строки, вы можете просто добавить его обратно с помощью echo или printf '\n', e. g.:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt
12
ответ дан 22 December 2017 в 21:24

Также your_command | paste -sd '', который сохраняет завершающий перевод строки.

4
ответ дан 22 December 2017 в 21:24

Можно передать многострочный вывод по каналу через 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

7
ответ дан 22 December 2017 в 21:24

Использование только оболочки:

while IFS= read -r line || [ -n "$line" ]; do printf "%s"  "$line"; done < inputfile.txt
1
ответ дан 22 December 2017 в 21:24

Этот ответ имеет решение проблемы, которую вы пытаетесь создать: Почему bash удаляет \ n в $ (cat file)?

Если вы введете cat myfile.txt, вы будете см .:

abc
def
ghi

Но если вы введете echo $(cat myfile.txt), вы увидите:

abc def ghi

Обратите внимание, что этот метод вставляет пробел, где раньше были отдельные новые строки. Это делает вывод более легким для чтения, но не строго соответствует объему вашего вопроса.

1
ответ дан 22 December 2017 в 21:24

Если вы используете Bash, то вы можете сделать это без какого-либо внешнего инструмента.

x=($(echo line1; echo line2))
echo "${x[@]}"

Результат:

line1 line2

Первая команда превращает многострочный вывод в массив, вторая команда расширяет массив до нескольких аргументов в одной строке.

0
ответ дан 22 December 2017 в 21:24

Если вы хотите использовать 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" }'
2
ответ дан 22 December 2017 в 21:24

Другие вопросы по тегам:

Похожие вопросы: