Sed / AWK поиск / замена строки после каждого соответствующего шаблона - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть данные в переменной, такие как json -

v={k1:v1,k2:v2,k3:v3,k4:v4,k5:v5,k6:v6,k7:v7,k8:v8}; 

, где ключом и значением могут быть любые значения.Мне нужно разделить это на несколько строк после каждых 10 символов ... что я сделал с помощью

echo "${v}" | sed -r 's/.{10}/&\n/g'

Это делает разделение согласно Sed.Но теперь мне нужно убедиться, что разделение должно происходить только после того, как после каждых 10 символов будет найден символ запятой ... так, чтобы вывод имел содержательные строки ... вывод должен быть ..

k1:v1,k2:v2,
.....

Вся идея неразрыв строки между

Спасибо

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Если на самом деле вы просто хотите добавить новую строку после каждой 2-й запятой, то это в GNU sed и некоторых других seds:

$ echo "$v" | sed 's/,[^,]*,/&\n/g'
k1:v1,k2:v2,
k3:v3,k4:v4,
k5:v5,k6:v6,
k7:v7,k8:v8

или это для переносимости через все seds всех оболочек:

sed 's/,[^,]*,/&\
/g'

или это с использованием любого awk:

awk '{gsub(/,[^,]*,/,"&\n")}1'
0 голосов
/ 23 февраля 2019

Извините, и спасибо за обратную связь здесь - ожидаемый результат -

{k1:v1,k2:v2,
k3:v3,k4:v4,
k5:v5,k6:v6,
k7:v7,k8:v8}

Правило должно искать первые 10 символов, а затем первую запятую при обнаружении добавить новую строку после этого шаблона.Фрагмент кода Wiktor делает это на самом деле.Тем не менее, я рад видеть, чтобы достичь этого другими способами.Спасибо всем.

0 голосов
/ 22 февраля 2019

Вы можете использовать

sed -r 's/.{10}[^,]*,/&\n/g'

См. Демо sed онлайн .

Шаблон .{10}[^,]*, соответствует

  • .{10} - любые 10 символов
  • [^,]* - 0 или более символов, отличных от ,
  • , - запятая.

Символ &\n шаблон замены заменяет все совпадение (&) и добавляет к нему новую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...