2013-03-22 3 views
50

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

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

+0

возможно дубликат [SED: Как заменить символ новой строки (\ п)] (http://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a- newline-n) – ruakh

+0

Кстати: (1) вам нужно поставить свой скрипт 'sed' в одинарные кавычки, чтобы Bash не возился с ним (поскольку' sed s/\ n// g' вызывает 'sed' с двумя аргументами, а именно 's/n /' и '/ g'); (2), так как вы хотите вывести файл 'cat ' grep pattern' будет * input * для 'sed', а не * аргументов * для' sed', вам нужно устранить 'xargs'; и (3) здесь нет необходимости в 'cat', так как' grep' может принимать имя файла в качестве второго аргумента. Итак, вы должны были попробовать файл grep pattern | sed 's/\ n// g''. (В этом случае это не сработало бы по причинам, указанным в приведенной выше ссылке, но теперь вы знаете на будущее.) – ruakh

+0

похоже на «http://stackoverflow.com/questions/2764051/how-to-join- multiple-lines-of-file-names-in-one-with-custom-delimiter " –

ответ

93

Используйте tr '\n' ' ', чтобы перевести все символы новой строки в пробелы:

$ grep pattern file | tr '\n' ' ' 

Примечание: grep читает файлы, cat сцепляет файлы. Не cat file | grep!

Edit:

tr может обрабатывать только одиночные преобразования символов. Вы можете использовать awk изменить выходной разделитель, как:

$ grep pattern file | awk '{print}' ORS='" ' 

Это преобразование:

one 
two 
three 

к:

one" two" three" 
+2

В конечном итоге вы получите нежелательное пространство с этим подходом. – sorin

+0

Вам нужно добавить 'echo '" 'в конец, чтобы добавить новую строку перед текстом запроса. – nexayq

+1

Это хорошо работает, однако я не хочу, чтобы разделитель отображался в самой последней записи. Пример, за ваш '' ', он отображается как« один »два« три », но я бы хотел, чтобы он отображался как« один »два« три ». Обратите внимание, что последние три не имеют круглых скобок. Есть идеи? – oink

14

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

cat file | grep pattern | paste -sd' ' 

As к твоему редактированию, я не уверен, что это значит, может быть, это?

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

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

+0

'grep' может читать сам файл. – Stephan

+2

@Stephan не нужно было предполагать, что 'cat file' будет фактически' cat' или даже файлом. (Я просто оставил эту часть без изменений, поскольку это не имело значения для вопроса) – sehe

29

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

grep pattern file | xargs 

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

+0

'| tr '\ n' '' не работал для меня при вызове через функцию php exec. Он игнорировал tr и просто дал последний матч от grep. '| xargs' работал. – Adarsha

+1

Это решение также имеет то преимущество, что оно «ест» пространства со входа. +1 – Rene

+0

Это должен быть принятый ответ. –

21

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

echo $(cat file) 
+1

Серьезно недооцененный ответ здесь, это действительно просто и работает как шарм, с завершающей новой строкой. – Dangercrow

+0

Это особенно удобно, если вы используете 'IFS = '$ (printf' \ n \ t ')" ' – aggsol

+2

Или просто' echo $ ( Normadize

2

Вот метод, использующий ex редактор:

  • J ойн все линий и p ечать на стандартный вывод:

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

    $ ex +%j -scwq file 
    

    Примечание: Это позволит объединить все строки внутри файла IT- самостоятельно!

Смежные вопросы