Как объединить несколько строк вывода в одну строку?

Как объединить несколько строк вывода в одну строку?

23.03.2013 01:27:51 Просмотров 72 Источник

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

cat file | grep pattern | xargs sed s/\n/ /g не работает на меня.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line#comment92996157_15580144
Вопрос с 68 голосами (140k просмотров) дублируется с поста, который имеет только 1 голос (12k просмотров)? Это неправильно.

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

Является ответом!
Chris Seymour

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" 
https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/15580184#comment59900606_15580184
При таком подходе вы в конечном итоге получаете нежелательное пространство в конце.
https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/15580184#comment66148634_15580184
Вам нужно добавить echo ""в конце, чтобы добавить новую строку перед текстом приглашения.
https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/15580184#comment70699560_15580184
Это хорошо работает, однако я не хочу, чтобы разделитель появился на самой последней записи. Например, в вашем ", он появляется как one" two" three", однако я бы хотел, чтобы он появился как one" two" three. Обратите внимание, что последние три не имеют скобок. Есть идеи?
https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/15580184#comment70699644_15580184
@oink вы можете передать результаты в sed '$s/..$//'удалить последние 2 символа в последней строке.
https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/15580184#comment94573758_15580184
Если вы хотите заменить новые строки ничем, вам нужно использовать опцию --delete, так как по умолчанию ожидается два аргумента. напримерtr --delete '\n'.
sehe

23.03.2013 01:41:31

Это может быть то, что вы хотите

cat file | grep pattern | paste -sd' '

Что касается вашей правки, я не уверен, что она означает, возможно, это?

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'

(предполагается, что ~не встречается в file)

https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/15580316#comment53710485_15580316
@Stephan не было необходимости предполагать, что cat fileна самом деле будет cat, или даже файл. (Я просто оставил эту часть без изменений, поскольку она не имела отношения к вопросу)
bluebadge

12.08.2014 12:35:10

Трубопровод вывода в xargsбудет объединять каждую строку вывода в одну строку с пробелами:

grep pattern file | xargs

Или любая команда, например. ls | xargs. По умолчанию ограничение на xargs вывода составляет ~4096 символов, но может быть увеличена с EG. xargs -s 8192.

https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/25251958#comment46766967_25251958
| tr '\n' ' ''' не работал для меня при вызове через php exec работал.
https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/25251958#comment51788481_25251958
Это решение также имеет то преимущество, что оно "съедает" пробелы из входных данных. +1
user1699917

05.11.2015 12:11:12

В bash echo без кавычек удалить символы возврата каретки, табуляции и множественные пробелы

echo $(cat file)
https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/33540439#comment70091851_33540439
Сильно недооцененный ответ здесь, это действительно просто и работает как очарование, с замыкающей новой линией, а также.
https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/33540439#comment70715943_33540439
Это особенно удобно, если вы используете IFS="$(printf '\n\t')"
https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/33540439#comment73855818_33540439
Или просто echo $(<file)... использование echo не только аккуратнее, чем использование tr '\n' ' ', но и лучше (подумайте \r\n
https://stackoverflow.com/questions/15580144/how-to-concatenate-multiple-lines-of-output-to-one-line/33540439#comment104408480_33540439
Как насчет без пространства?
kenorb

21.12.2016 01:19:26

Вот метод, использующий exeditor (часть Vim):

  • J oin все линии и P rint к стандартному выходу:

    $ ex +%j +%p -scq! file
    
  • J oin все строки на месте (в файле):

    $ ex +%j -scwq file
    

    Примечание: это объединит все строки внутри файла IT-self!

Vladimir Yahello

12.03.2018 02:22:37

Вероятно, лучший способ сделать это-использовать инструмент awk, который будет генерировать выходные данные в одну строку

$ awk ' /pattern/ {print}' ORS=' ' /path/to/file

Он объединит все линии в одну с разделителем пространства

Richard Gomes

02.08.2018 03:26:20

Это пример, который производит выходные данные, разделенные запятыми. Вы можете заменить запятую любым разделителем, который вам нужен.

cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD

производит:

1,2,3,4,5
simhumileco

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).

Закрыть X