Як я можу надрукувати багаторядковий вихід на одному рядку?


Відповіді:


13

Ви можете видалити всі зустрічі символів із заданого набору за допомогою tr -d. Щоб видалити символ нового рядка, використовуйте:

tr -d '\n'

Як завжди, ви можете використовувати переадресацію вводу та виводу та труби для читання або запису до файлів та інших процесів.

Якщо ви хочете зберегти останній новий рядок, ви можете просто додати його назад echoабо printf '\n', наприклад:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt

10

Багато шляхів. Для ілюстрації я зберегла ваш приклад у 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

Я думаю, що комбінований printf+ cat+ perlнабагато краще обробляється за допомогою perl -pe 's/\n//;END{printf "\n"}' input.txt єдиного процесу, без заміни команд і безладу з цитатами і без UUOC. Можливо,
Сергій Колодяжний

7

Ви можете передати багатолінійний вихід через 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



2

Якщо ви хочете використовувати 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

Якщо ви переспрямовуєтесь із цієї команди з (або, як показує Девід Фоерстер) , ви можете включити її, щоб результат обох команд взявся разом. Якщо ви просто друкуєте його до терміналу, ви можете запустити його точно так, як показано вище. Це працює , навіть якщо ви трубопроводи або перенаправляти до команді, тому що / практично не вимагає ніякого введення. Тобто це працює:{ ;}echoprintf '\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" }'

perl -wpe 'chomp; END { print "\n" } це той самий процес, незначна перевага над додаванням відлуння
Сергій Колодяжний


1

Ця відповідь вирішує проблему, яку ви намагаєтеся створити: Чому bash видаляє \ n у $ (файл cat)?

Якщо ви введете, cat myfile.txtви побачите:

abc
def
ghi

Але якщо ви введете, echo $(cat myfile.txt)ви побачите:

abc def ghi

Зверніть увагу, що цей метод вставляє простір, де раніше були окремі нові рядки. Це полегшує читання результатів, але не чітко дотримується сфери ваших питань.


0

Якщо ви використовуєте Bash, ви можете це зробити без будь-якого зовнішнього інструменту.

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

Результат:

line1 line2

Перша команда перетворює багаторядний вихід у масив, друга команда розширює масив на кілька аргументів в одному рядку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.