Как объединить несколько строк вывода в одну строку?
Если я выполняю команду cat file | grep pattern
, я получаю много строк вывода. Как объединить все строки в одну строку, эффективно заменив каждую "\n"
на "\" "
(конец на"
, за которым следует пробел)?
cat file | grep pattern | xargs sed s/\n/ /g
не работает на меня.




Ответы - Как объединить несколько строк вывода в одну строку? / How to concatenate multiple lines of output to one line?

23.03.2013 01:31:18
Используйте tr '\n' ' '
'' для перевода всех символов новой строки в пробелы:
$ grep pattern file | tr '\n' ' '
Примечание: grep
читает файлы, cat
объединяет файлы. Не cat file | grep
!
Редактировать:
tr
может обрабатывать только односимвольные переводы. Вы можете использовать awk
для изменения выходного разделителя записей, например:
$ grep pattern file | awk '{print}' ORS='" '
Это бы преобразило:
one
two
three
к:
one" two" three"


echo ""
в конце, чтобы добавить новую строку перед текстом приглашения.

"
, он появляется как one" two" three"
, однако я бы хотел, чтобы он появился как one" two" three
. Обратите внимание, что последние три не имеют скобок. Есть идеи?

sed '$s/..$//'
удалить последние 2 символа в последней строке.

--delete
, так как по умолчанию ожидается два аргумента. напримерtr --delete '\n'
.


cat file
на самом деле будет cat
, или даже файл. (Я просто оставил эту часть без изменений, поскольку она не имела отношения к вопросу)

12.08.2014 12:35:10
Трубопровод вывода в xargs
будет объединять каждую строку вывода в одну строку с пробелами:
grep pattern file | xargs
Или любая команда, например. ls | xargs
. По умолчанию ограничение на xargs
вывода составляет ~4096 символов, но может быть увеличена с EG. xargs -s 8192
.



05.11.2015 12:11:12
В bash echo
без кавычек удалить символы возврата каретки, табуляции и множественные пробелы
echo $(cat file)


IFS="$(printf '\n\t')"

echo $(<file)
... использование echo не только аккуратнее, чем использование tr '\n' ' '
, но и лучше (подумайте \r\n



12.03.2018 02:22:37
Вероятно, лучший способ сделать это-использовать инструмент awk, который будет генерировать выходные данные в одну строку
$ awk ' /pattern/ {print}' ORS=' ' /path/to/file
Он объединит все линии в одну с разделителем пространства

02.08.2018 03:26:20
Это пример, который производит выходные данные, разделенные запятыми. Вы можете заменить запятую любым разделителем, который вам нужен.
cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD
производит:
1,2,3,4,5

06.02.2020 09:55:32
Самые быстрые и простые способы, которые я знаю, чтобы решить эту проблему:
Когда мы хотим заменить символ новой строки \n
пробелом:
xargs < file
xargs
есть свои ограничения на количество символов в строке и количество всех символов вместе взятых, но мы можем их увеличить. Подробности можно узнать, выполнив эту команду: xargs --show-limits
и, конечно, в руководстве: man xargs
Когда мы хотим заменить один символ на другой ровно один символ:
tr '\n' ' ' < file
Когда мы хотим заменить один символ на много символов:
tr '\n' '~' < file | sed s/~/many_characters/g
Сначала мы заменяем символы \n
на Тильды ~
(или выбираем Другой уникальный символ, отсутствующий в тексте), а затем заменяем символы Тильды любыми другими символами ( many_characters
) и делаем это для каждой Тильды (флаг g
).