Я хочу удалить запятую из json as,
{
"key1": "value1",
"object": {
"key2": "value2", // <- remove comma
},
"key3": "value3", // <- remove comma
}
Я придумал,
tr -d '\n' | \
sed -E 's:,(\s*}):\1:g' | \
jq .
и это работает, но я хочу получить это полностью в sed
.
Я придумал,
sed -E '/,\s*$/ { N; s:,\s*(\n\s*},?):\1: }'
, который работает для указанного выше ввода, но не работает для
{
"key1": "value1",
"object": {
"key2": "value2",
},
"key3": "value3",
"key4": "value4", // <- remove comma
}
когда N
читает следующую строку и начинается снова со строки после следующей.
// output sed -E '/,\s*$/ { N;l }' using l/look command
{
"key1": "value1",\n "object": {$
"key1": "value1",
"object": {
"key2": "value2",\n },$
"key2": "value2",
},
"key3": "value3",\n "key4": "value4",$
"key3": "value3",
"key4": "value4",
}
Обновление:
Добавление еще одного примера для тестирования:
{
"key1": "value1",
"object1": {
"object2": {
"key2": "value2"
},
},
"key3": "value3",
}
Обновление:
Это работает для всего, что я бросил в это.
sed -E -n 'H; x; s:,(\s*\n\s*}):\1:; P; ${x; p}' | \
sed '1 d'
Пояснение:
sed -E -n 'H; x; P; ${x; p}'
-n 'H; x'
для добавления каждой строки к следующей строке в шаблонном пространстве (за исключением последней строки, которая просто печатается с ${x; p}
)
и
s:,(\s*\n\s*}):\1:;
чтобы удалить запятую в образце.