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

Я ответил на этот вопрос SO, но вот этот ответ, перепечатан.

Для 14.04-16.04 выполните следующие действия:

Загрузите драйверы из поддержки Canon. Извлеките файл в каталог. Из этого каталога:
cd ~/Downloads
tar -xf Linux_UFRII_PrinterDriver_*.tar.*
sudo dpkg -i Linux_UFRII_PrinterDriver_*/*/Debian/*_$(dpkg --print-architecture).deb
sudo apt-get install -f
Не нужно перезагружаться, но если следующий шаг завершится неудачно, перезагрузитесь и повторите попытку. Запустите «Добавить принтер». Это должно просто отображаться автоматически, когда вы нажимаете кнопку «Добавить». Дайте ему несколько секунд, и принтер щебетает, а затем просто волшебным образом появляется.

EDIT 2/27/16 (16.04beta) Обновлена ​​ссылка на драйвер 3.10 (они обновили свой сайт). Все, что просто работало с использованием выше, не нужно перезагружать.

EDIT 9/8/16: Текущая версия драйвера теперь 3.20. Сделать команды установки агностическими как для версии драйвера, так и для системной архитектуры.

12
задан 22 December 2017 в 22:24

16 ответов

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

tr -d '\n'

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

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

cat file1 file2... | { tr -d '\n'; echo; } > output.txt
12
ответ дан 18 July 2018 в 00:39

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

awk '{printf "%s",$0} END {print ""}'

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

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

Пример run

$ 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
ответ дан 18 July 2018 в 00:39

Если вы хотите использовать Perl для этого, вы можете использовать его функцию chomp:

perl -pe chomp

Еще несколько деталей для тех, кто интересуется.

Вы можете передать один или несколько имен файлов в качестве последующих аргументов.

perl -pe chomp file1 file2 file3

В некоторых случаях вы можете не захотеть этого делать, но вместо этого вы можете перенаправить или перенаправить на эту команду. (Эти возможности - и это оговорка - все применимы к любому другому решению perl -p или perl -n.)

Итак, если вы хотите обработать вывод из запуска some-command: [ ! d6] some-command | perl -pe chomp

Это потенциально быстрее, чем команда Perl в . В некоторых случаях вам может не понадобиться делать это . Символы новой строки (представленные \n) появляются только в конце строк в этой ситуации - потому что они используют Perl, чтобы решить, где заканчивается каждая строка. s/\n// выполняет поиск по всей строке для строк новой строки, а chomp просто удаляет одну из них в конце (если таковая имеется, так как последняя строка может иметь или не иметь ее).

Производительность может и не быть быть главной причиной, чтобы предпочесть chomp. Команда perl в ответе terdon будет только немного медленнее, если вы не обрабатываете огромный файл с очень длинными строками. И если вам нужна скорость, путь Дэвида Фёрстера по-прежнему, вероятно, быстрее. chomp, однако, является правильным инструментом для этого, если вы используете Perl, и я думаю, что цель chomp понятна, чем s/\n//.

Печать окончательной новой строки.

Однако я рекомендую не использовать подстановку команд ($( )), просто для того, чтобы напечатать завершающую новую строку. Если текст, который вы обрабатываете, короток, это может быть довольно медленным - он должен сразу собрать весь текст, а затем распечатать его, и это затрудняет понимание вашей команды. Вместо этого вы можете выполнить ответ terdon и затем запустить echo или printf '\n'.

perl -pe chomp; echo

Если вы используете трубку some-command или (как показывает Дэвид Фостер), перенаправляя эту команду, вы можете заключить ее в { ;}, чтобы результат обеих команд был взят вместе. Если вы просто печатаете его на терминале, вы можете запустить его точно так, как показано выше. Это работает даже в том случае, если вы перенаправляете или перенаправляете команду, потому что echo / printf '\n' на самом деле не читает никаких ввода. То есть, это работает:

some-command | perl -pe chomp; echo

Хотя здесь вы не можете просто удалить { ;}:

{ perl -pe chomp; echo; } | some-other-command

Или, если хотите, вы можете сделать perl распечатать окончательную новую строку. Как и в случае perl и echo команд в { ;}, этот подход работает, даже если вы выполняете или перенаправляете из его (и, как и все подходы, это работает, когда вы 're pipeing в тоже):

perl -wpe 'chomp; END { print "\n" }'

Обратите внимание, что команда в ответе terdon отлично работает с этими методами печати окончательной новой строки. Например:

perl -pe 's/\n//'; echo perl -pe 's/\n//; END { print "\n" }'
2
ответ дан 18 July 2018 в 00:39

Также your_command | paste -sd '', который сохраняет конечную новую строку.

4
ответ дан 18 July 2018 в 00:39

Много способов. Для иллюстрации я сохранил ваш пример в 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
ответ дан 18 July 2018 в 00:39

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

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

Результат:

line1 line2

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

0
ответ дан 18 July 2018 в 00:39

Использование shell-only:

while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
1
ответ дан 18 July 2018 в 00:39

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

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

abc def ghi

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

abc def ghi

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

1
ответ дан 18 July 2018 в 00:39

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

tr -d '\n'

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

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

cat file1 file2... | { tr -d '\n'; echo; } > output.txt
12
ответ дан 24 July 2018 в 17:15

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

awk '{printf "%s",$0} END {print ""}'

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

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

Пример run

$ 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
ответ дан 24 July 2018 в 17:15

Если вы хотите использовать Perl для этого, вы можете использовать его функцию chomp:

perl -pe chomp

Еще несколько деталей для тех, кто интересуется.

Вы можете передать один или несколько имен файлов в качестве последующих аргументов.

perl -pe chomp file1 file2 file3

В некоторых случаях вы можете не захотеть этого делать, но вместо этого вы можете перенаправить или перенаправить на эту команду. (Эти возможности - и это оговорка - все применимы к любому другому решению perl -p или perl -n.)

Итак, если вы хотите обработать вывод из запуска some-command: [ ! d6] some-command | perl -pe chomp

Это потенциально быстрее, чем команда Perl в . В некоторых случаях вам может не понадобиться делать это . Символы новой строки (представленные \n) появляются только в конце строк в этой ситуации - потому что они используют Perl, чтобы решить, где заканчивается каждая строка. s/\n// выполняет поиск по всей строке для строк новой строки, а chomp просто удаляет одну из них в конце (если таковая имеется, так как последняя строка может иметь или не иметь ее).

Производительность может и не быть быть главной причиной, чтобы предпочесть chomp. Команда perl в ответе terdon будет только немного медленнее, если вы не обрабатываете огромный файл с очень длинными строками. И если вам нужна скорость, путь Дэвида Фёрстера по-прежнему, вероятно, быстрее. chomp, однако, является правильным инструментом для этого, если вы используете Perl, и я думаю, что цель chomp понятна, чем s/\n//.

Печать окончательной новой строки.

Однако я рекомендую не использовать подстановку команд ($( )), просто для того, чтобы напечатать завершающую новую строку. Если текст, который вы обрабатываете, короток, это может быть довольно медленным - он должен сразу собрать весь текст, а затем распечатать его, и это затрудняет понимание вашей команды. Вместо этого вы можете выполнить ответ terdon и затем запустить echo или printf '\n'.

perl -pe chomp; echo

Если вы используете трубку some-command или (как показывает Дэвид Фостер), перенаправляя эту команду, вы можете заключить ее в { ;}, чтобы результат обеих команд был взят вместе. Если вы просто печатаете его на терминале, вы можете запустить его точно так, как показано выше. Это работает даже в том случае, если вы перенаправляете или перенаправляете команду, потому что echo / printf '\n' на самом деле не читает никаких данных. То есть, это работает:

some-command | perl -pe chomp; echo

Хотя здесь вы не можете просто удалить { ;}:

{ perl -pe chomp; echo; } | some-other-command

Или, если хотите, вы можете сделать perl распечатать окончательную новую строку. Как и в случае perl и echo команд в { ;}, этот подход работает, даже если вы выполняете или перенаправляете из его (и, как и все подходы, это работает, когда вы 're pipeing в тоже):

perl -wpe 'chomp; END { print "\n" }'

Обратите внимание, что команда в ответе terdon отлично работает с этими методами печати окончательной новой строки. Например:

perl -pe 's/\n//'; echo perl -pe 's/\n//; END { print "\n" }'
2
ответ дан 24 July 2018 в 17:15
  • 1
    perl -wpe 'chomp; END { print "\n" } - это тот же процесс, незначительное преимущество перед добавлением трейлинг-эха – Sergiy Kolodyazhnyy 17 March 2018 в 22:18

Также your_command | paste -sd '', который сохраняет конечную новую строку.

4
ответ дан 24 July 2018 в 17:15

Много способов. Для иллюстрации я сохранил ваш пример в 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
ответ дан 24 July 2018 в 17:15
  • 1
    Я думаю, что комманда printf + cat + perl намного лучше обрабатывается через perl -pe 's/\n//;END{printf "\n"}' input.txt Single process, без подстановки команд и возиться с кавычками, и нет UUOC. Может быть. – Sergiy Kolodyazhnyy 1 June 2018 в 03:10

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

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

Результат:

line1 line2

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

0
ответ дан 24 July 2018 в 17:15

Использование shell-only:

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

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

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

abc def ghi

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

abc def ghi

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

1
ответ дан 24 July 2018 в 17:15

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

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