Использование sed для удаленияQuoted слов вQuoted строке

Вопрос или проблема

У меня есть файл JSON с тысячами строк, следующим образом:

"title": "Revert "Merge branch \"mq-fw-v3\" into dev""

То, что остается неизменным, это “title:” (с кавычками). А ближе к концу есть слово into. В общем, title является ключом, а все после двоеточия ( : ) — значением. Основная задача — удалить часть “Merge branch “mq-fw-v3″ into dev”, вместе с кавычками. Другими словами, я хочу удалить значение.

Я пытался сделать это с помощью sed, но не смог. ОБРАТИТЕ ВНИМАНИЕ, что есть также строки, такие как:

"title": "Merge branch "git-ci-cd" into stage"

в которых есть только одна строка в кавычках, git-ci-cd в этом случае, внутри внешней строки в кавычках, которая в этом случае — “Merge branch “git-ci-cd” into stage”. Я хочу удалить и их. Только часть значения.

Какие идеи?

ИЗМЕНЕНИЕ

Я пробую следующий регулярное выражение:

sed -e 's#Merge branch \"[[:print:]]\{3,\}\" into [[:print:]]\{0,\}\"##g'

Но затем возникло исключительное дело:

"title": "Merge branch "stage" of https://gitlab.phonepe.com/om/backend/hermes into stage"

Я думаю, что это передний слеш, который не охватывается. Есть идеи, как это тоже охватить?

Ответ или решение

Для решения задачи удаления значений вQuoted Strings ключа "title" с использованием утилиты sed, важно учесть различные сценарии, в которых могут встречаться строки как с одиночными, так и с вложенными кавычками. В этой ситуации мы разработаем регулярное выражение, которое может обработать различные формы значений, включая те, которые содержат символы, такие как слэши.

Шаги к решению:

  1. Общая структура строки: Мы будем искать строки, начинающиеся с "title":, за которым следует строка, заключённая в кавычки. Эта строка содержит как текст, так и возможные вложенные термины, заключённые в кавычки. Наша задача – удалить всё между двоеточием и закрывающей кавычкой.

  2. Регулярное выражение: Сложность добавляется с учетом различных вложенных кавычек и символов. Вот пример решения:

    sed -E 's/("title": ")[^"]*("[^"]*")?/\1""/'

    В этом выражении:

    • ("title": ") — захватывает ключ и открывающие кавычки.
    • [^"]* — захватывает любые символы, кроме закрывающей кавычки.
    • ("[^"]*")? — необязательная часть, которая захватывает вложенные строки в кавычках, если они есть.
    • \1"" — замена: оставляем ключ и первый открывающий элемент, а затем вставляем пустую строку с открывающими и закрывающими кавычками.
  3. Учет слэшев: Чтобы учесть символы, такие как обратный слэш, можно адаптировать регулярное выражение, добавив поддержку этого символа:

    sed -E 's/("title": ")[^"]*(\\[^"]*[^"]*)*("[^"]*")?/\1""/'

    Здесь добавлена возможность захвата любой последовательности, где может встречаться слэш.

Пример:

Предположим, у нас есть файл data.json со следующими строками:

"title": "Revert \"Merge branch \\\"mq-fw-v3\\\" into dev\"",
"title": "Merge branch \"git-ci-cd\" into stage",
"title": "Merge branch \"stage\" of https://gitlab.phonepe.com/om/backend/hermes into stage"

Применение sed:

Выполните команду sed для обработки файла:

sed -E 's/("title": ")[^"]*(\\[^"]*[^"]*)*("[^"]*")?/\1""/' data.json > output.json

Заключение:

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

Оцените материал
Добавить комментарий

Капча загружается...