2017-02-15 13 views
0

Я пытаюсь заменить предыдущую строку совпадения строк.Sed для замены предыдущей строки

Пример JSON

"test" : { 
    "aa" : true, 
    "ac" : "port", 
    "tr" : "p2", 
    "ll" : 90, 
    "mp" : true 
    } 

Если "LL" равен 90, мне нужно изменить предыдущую строку "му": "p1". Я попробовал следующее sed, но он всегда заменяет ту же строку вместо предыдущей строки. Пожалуйста, предложите

sed -e '/"ll" : 90/!b;!N;c"mu" : "p1"' 
+1

Если вы показать свой полный объект JSON , кто-то может показать вам, как это сделать с помощью правильный JSON-парсер, такой как jq, вместо чего-то хрупкого, как sed. –

+0

Согласен с @BenjaminW. здесь рекомендуется использовать инструменты JSON, такие как 'jq' для управления текстовыми файлами json. – Inian

ответ

1

Вы можете попробовать это sed:

sed 'N;/\n *"ll" : 90/{s/^\([^"]*\).*\n/\1"mu" : "p1",\n/;};P;D' file 

Как было предложено @potong,

sed -r 'N;s/.*(\n(\s*)"ll" : 90,)/\2"mu : "p1",\1/;P;D' file 

Выход:

"test" : { 
    "aa" : true, 
    "ac" : "port", 
    "mu" : "p1", 
    "ll" : 90, 
    "mp" : true 
} 
+0

Поскольку подстановка является неотъемлемой частью соответствия, требуется одна команда, возможно, 'sed -r 'N; s /.* (\ n (\ s *)" ll ": 90,)/\ 2" mu: «p1», \ 1 /; P; D 'file' может выполнить эту работу. – potong