Чи існує спосіб друкувати багаторядковий вихід (один вихід) на одному рядку?
Наприклад, якщо вихід:
abc
def
qwerty
Чи можливо друкувати:
abcdefqwerty
Чи існує спосіб друкувати багаторядковий вихід (один вихід) на одному рядку?
Наприклад, якщо вихід:
abc
def
qwerty
Чи можливо друкувати:
abcdefqwerty
Відповіді:
Ви можете видалити всі зустрічі символів із заданого набору за допомогою tr -d
. Щоб видалити символ нового рядка, використовуйте:
tr -d '\n'
Як завжди, ви можете використовувати переадресацію вводу та виводу та труби для читання або запису до файлів та інших процесів.
Якщо ви хочете зберегти останній новий рядок, ви можете просто додати його назад echo
або printf '\n'
, наприклад:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
Багато шляхів. Для ілюстрації я зберегла ваш приклад у 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
Ви можете передати багатолінійний вихід через 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
Також, your_command | paste -sd ''
що зберігає зворотний новий рядок.
Якщо ви хочете використовувати 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" }'
perl -wpe 'chomp; END { print "\n" }
це той самий процес, незначна перевага над додаванням відлуння
Використовуючи лише оболонку:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
Ця відповідь вирішує проблему, яку ви намагаєтеся створити: Чому bash видаляє \ n у $ (файл cat)?
Якщо ви введете, cat myfile.txt
ви побачите:
abc
def
ghi
Але якщо ви введете, echo $(cat myfile.txt)
ви побачите:
abc def ghi
Зверніть увагу, що цей метод вставляє простір, де раніше були окремі нові рядки. Це полегшує читання результатів, але не чітко дотримується сфери ваших питань.
printf
+cat
+perl
набагато краще обробляється за допомогоюperl -pe 's/\n//;END{printf "\n"}' input.txt
єдиного процесу, без заміни команд і безладу з цитатами і без UUOC. Можливо,