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

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

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

abc
def
qwerty

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

abcdefqwerty 
13
задан 23.12.2017, 06:24

8 ответов

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

tr -d '\n'

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

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

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

Вы можете передать свой многострочный выход через awk

awk '{printf "%s",[110]} END {print ""}'

или использовать sed:

sed ':a;N;$!ba;s/\n//g'

Пример выполнения

$ echo -e "1\n2\n3\n4" | awk '{printf "%s",[112]} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'              
1234

Дальнейшее чтение : удалить разрыв строки, используя AWK · serverfault.SE

7
ответ дан 09.07.2019, 22:37

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

4
ответ дан 09.07.2019, 22:37

Много способов. Чтобы проиллюстрировать это, я сохранил ваш пример в 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
ответ дан 09.07.2019, 22:37
  • 1
    Я думаю, что комбо printf + cat + perl намного лучше обрабатывается через perl -pe 's/\n//;END{printf "\n"}' input.txt одиночный процесс, без подстановки команд и работы с кавычками, и без UUOC. Может быть. – Peter Mortensen 01.06.2018, 13:10

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

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

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

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

abc
def
ghi

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

abc def ghi

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

1
ответ дан 09.07.2019, 22:37

Если вы хотите использовать 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
ответ дан 09.07.2019, 22:37
  • 1
    perl -wpe 'chomp; END { print "\n" } - это тот же процесс, незначительное преимущество перед добавлением конечного эха – Teemu Leisti 18.03.2018, 06:18

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

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

Результат:

line1 line2

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

0
ответ дан 09.07.2019, 22:37

Теги

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