Как заменить строку между последующим появлением 2-х строкового шаблона в сценариях Shell? - PullRequest
2 голосов
/ 11 декабря 2019

У меня есть файл, который имеет несколько строк, таких как:

"key1":"val1","key2":"val2","key3":"val3","key4":"val4"

В редакторе vi или с использованием sed Я хочу заменить весь текст между ":" и "," на ",", т.е. я хочу сохранить все ключи и удалить все значения.

Строка будет выглядеть так:

"key1","key2","key3","key4"

В vi редакторе Я пытался использовать :%s/":".*","/","/g, а с использованием sed я использовал sed 's/":"*","/","/', но вместо замены в- между текстом, он удаляет весь текст из первого вхождения ":" и последнего вхождения ",", т.е. строка становится "key1","key4":"val4".

Как заменить текст между последующимивхождения ":" и следующие ","?

1 Ответ

1 голос
/ 11 декабря 2019

Предполагая, что ни ключ, ни значение не могут содержать ", это решение sed будет работать:

   sed 's/\("[^"]*"\):"[^"]*"/\1/g'

Объяснение:

  • s/ подставьте
  • /\("[^"]*"\):"[^"]*"/ и найдите "stuff":"more stuff", где предполагается, что других двойных кавычек нет " в stuff и т. д., а затем захватите первую часть (с помощью \(и \))
  • /\1/ сохранить только первую часть
  • /g и продолжить
...