Как добавить запятую в конце каждой строки, кроме последней строки?

Я хочу добавить запятую в конце каждой строки этого типа файла, кроме последней строки:

У меня есть это сейчас:

{...}
{...}
{...}
{...}

Я хочу это:

{...},
{...},
{...},
{...}

Как я могу это сделать с помощью командной строки? Возможно ли это с командой sed?

Ответ 1

Следующий sed script имеет адресное выражение $!, которое соответствует строкам, которые не являются последними, и подстановочное действие s/$/,/, которое добавляет запятую рядом с концом строки.

sed '$!s/$/,/' file

($ в адресе относится к последней строке, а $ в регулярном выражении в подстановке относится к последней позиции символа в каждой строке. Они не связаны, хотя в некотором смысле похожи.)

Это выводит измененное содержимое file на стандартный вывод; перенаправить в другой файл, чтобы сохранить их в файл, или использовать sed -i, если это поддерживает sed. (Некоторые варианты требуют пустого аргумента опции -i, в частности, * BSD/OSX sed.)

Если ваша задача - генерировать действительный JSON из чего-то, чего нет, я скептически отношусь к этому подходу. Структурированные форматы должны обрабатываться инструментами, которые понимают структурированные форматы, а не базовые инструменты, ориентированные на линию; но если это поможет вам преобразовать данные, ориентированные на линию, в правильное JSON, это, вероятно, допустимое использование.

... Как запоздалая мысль, возможно, вы захотите также обернуть вывод в набор квадратных скобок. Тогда это фактически технически обоснованный JSON (предполагая, что каждая строка является действительным фрагментом JSON сама по себе).

sed '1s/^/[/;$!s/$/,/;$s/$/]/' file

В первой строке (адресное выражение 1) замените в квадратной скобке открытия в начале строки (s/^/[/). В строках, которые не являются последними, добавьте конечную запятую, как указано выше. В строке, которая является последней (адресное выражение $), добавьте закрывающую квадратную скобку в конце строки (s/$/]/). Если вы предпочитаете переносить строки в точку с запятой, это прекрасно; многие диалекты sed также позволяют разбить это на несколько аргументов -e.

Ответ 2

Держите его простым, просто используйте awk:

$ awk '{printf "%s%s",sep,$0; sep=",\n"} END{print ""}' file
{...},
{...},
{...},
{...}

Ответ 3

Мой файл содержит данные как '5555', '6666', '7777',

Я хочу удалить последнюю запятую и хочу вывод как '5555', '6666', '7777' Как я могу сделать это с помощью командной строки? Возможно ли это с помощью команды sed?

Ответ 4

Вы можете использовать что-то вроде этого:

 sed 's/$/,/' file.txt > file_with_added_commas.txt

Это заменит конец строки на "," и напишет ее в файл_with_added_commas.txt

Для получения дополнительной информации см. добавить текст в конце каждой строки