Если я запускаю команду cat file | grep pattern
, я получаю много строк вывода. Как объединить все строки в одну строку, эффективно заменив каждую "\n"
из них на "\" "
(конец заканчивается "
пробелом)?
cat file | grep pattern | xargs sed s/\n/ /g
не работает для меня
sed
скрипт в одинарные кавычки, чтобы Bash не связывался с ним (так какsed s/\n/ /g
вызываетsed
с двумя аргументами, а именноs/n/
и/g
); (2) , так как вы хотите выходcat file | grep pattern
быть вход вsed
, а не аргументы вsed
, необходимо устранитьxargs
; и (3) здесь нет необходимостиcat
, поскольку онgrep
может принимать имя файла в качестве второго аргумента. Итак, вы должны были попробоватьgrep pattern file | sed 's/\n/ /g'
. (В этом случае это не сработало бы по причинам, указанным в приведенной выше ссылке, но теперь вы знаете, на будущее.)Ответы:
Используйте
tr '\n' ' '
для перевода всех символов новой строки в пробелы:Примечание:
grep
читает файлы,cat
объединяет файлы. Не надоcat file | grep
!Редактировать:
tr
может обрабатывать только односимвольные переводы. Вы можете использоватьawk
для изменения разделителя выходной записи, например:Это преобразовало бы:
чтобы:
источник
echo ""
в конце, чтобы добавить новую строку перед текстом приглашения."
, это выглядит какone" two" three"
, однако я хотел бы, чтобы это отображалось какone" two" three
. Обратите внимание, что последние три не имеют круглых скобок. Любые идеи?sed '$s/..$//'
чтобы удалить последние 2 символа в последней строке.--delete
опцию, так как по умолчанию ожидается два аргумента. напримерtr --delete '\n'
.Конвейер вывода до
xargs
объединит каждую строку вывода в одну строку с пробелами:Или любая команда, например.
ls | xargs
, Пределxargs
вывода по умолчанию составляет ~ 4096 символов, но его можно увеличить, например, с помощью.xargs -s 8192
,Grep xargs
источник
| tr '\n' ' '
не работал для меня, когда вызывается черезphp exec
функцию. Он игнорировал tr и просто давал последний матч от grep.| xargs
работал.В bash
echo
без кавычек удаляйте возврат каретки, табуляцию и несколько пробеловисточник
IFS="$(printf '\n\t')"
echo $(<file)
... использование эха не только аккуратнее, чем использованиеtr '\n' ' '
, но и лучше (подумайте об\r\n
окончании строки). @aggsol, ты можешь просто сказатьIFS=$'\n\t'
Это может быть то, что вы хотите
Что касается вашего редактирования, я не уверен, что это значит, возможно, это?
(это предполагает, что
~
не происходит вfile
)источник
cat file
будет на самом делеcat
или даже файл. (Я просто оставил эту часть без изменений, поскольку это не имело отношения к вопросу)Это пример, который производит вывод через запятую. Вы можете заменить запятую на любой разделитель, который вам нужен.
производит:
источник
Вот метод с использованием
ex
редактора (часть Vim ):J ойн всех линий и р RINT в стандартный выходной поток:
J ойн все линии в месте (в файле):
Примечание: это объединит все строки внутри самого файла!
источник
Самые быстрые и простые способы, которые я знаю, чтобы решить эту проблему:
Когда мы хотим заменить символ новой строки
\n
пробелом :xargs
имеет собственные ограничения на количество символов в строке и количество всех символов в сочетании, но мы можем увеличить их. Подробности можно узнать, выполнив эту команду:xargs --show-limits
и, конечно, в руководстве:man xargs
Когда мы хотим заменить один символ другим точно таким же :
Когда мы хотим заменить один символ на множество символов :
Сначала мы заменяем символы новой строки
\n
для тильд~
(или выбираем другой уникальный символ, отсутствующий в тексте), а затем заменяем символы тильды любыми другими символами (many_characters
) и делаем это для каждой тильды (флагаg
).источник
Вероятно, лучший способ сделать это - использовать инструмент awk, который будет генерировать вывод в одну строку
Он объединит все строки в одну с пробелом
источник
{print}
так как это действие по умолчанию в awk.Вот еще один простой метод с использованием
awk
:Кроме того, если в вашем файле есть столбцы, это упрощает объединение только определенных столбцов:
источник
На Red Hat Linux я просто использую echo:
echo $ (cat / some / file / name)
Это дает мне все записи файла в одну строку.
источник