Вы можете удалить все вхождения символов из данного набора с помощью tr -d
. Чтобы удалить символ новой строки, используйте:
tr -d '\n'
Как всегда вы можете использовать перенаправление ввода и вывода и каналы для чтения или записи в файлы и другие процессы.
Если вы хотите сохранить последний символ новой строки, вы можете просто добавить его обратно с помощью echo
или printf '\n'
, e. g.:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
Вы можете передать свой многострочный выход через 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
Много способов. Чтобы проиллюстрировать это, я сохранил ваш пример в 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. Может быть.
– Peter Mortensen
01.06.2018, 13:10
Этот ответ имеет решение проблемы, которую вы пытаетесь создать: Почему bash удаляет \ n в $ (cat file)?
Если вы введете cat myfile.txt
, вы будете см .:
abc
def
ghi
Но если вы введете echo $(cat myfile.txt)
, вы увидите:
abc def ghi
Обратите внимание, что этот метод вставляет пробел, где раньше были отдельные новые строки. Это делает вывод более легким для чтения, но не строго соответствует объему вашего вопроса.
Если вы хотите использовать 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" }
- это тот же процесс, незначительное преимущество перед добавлением конечного эха
– Teemu Leisti
18.03.2018, 06:18
Если вы используете Bash, то вы можете сделать это без какого-либо внешнего инструмента.
x=($(echo line1; echo line2))
echo "${x[@]}"
Результат:
line1 line2
Первая команда превращает многострочный вывод в массив, вторая команда расширяет массив до нескольких аргументов в одной строке.