Вопрос или проблема
У меня есть файл 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
, важно учесть различные сценарии, в которых могут встречаться строки как с одиночными, так и с вложенными кавычками. В этой ситуации мы разработаем регулярное выражение, которое может обработать различные формы значений, включая те, которые содержат символы, такие как слэши.
Шаги к решению:
-
Общая структура строки: Мы будем искать строки, начинающиеся с
"title":
, за которым следует строка, заключённая в кавычки. Эта строка содержит как текст, так и возможные вложенные термины, заключённые в кавычки. Наша задача – удалить всё между двоеточием и закрывающей кавычкой. -
Регулярное выражение: Сложность добавляется с учетом различных вложенных кавычек и символов. Вот пример решения:
sed -E 's/("title": ")[^"]*("[^"]*")?/\1""/'
В этом выражении:
("title": ")
— захватывает ключ и открывающие кавычки.[^"]*
— захватывает любые символы, кроме закрывающей кавычки.("[^"]*")?
— необязательная часть, которая захватывает вложенные строки в кавычках, если они есть.\1""
— замена: оставляем ключ и первый открывающий элемент, а затем вставляем пустую строку с открывающими и закрывающими кавычками.
-
Учет слэшев: Чтобы учесть символы, такие как обратный слэш, можно адаптировать регулярное выражение, добавив поддержку этого символа:
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!