Поиск и замена CDATA с регулярным выражением - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь создать сценарий bash, который просматривает некоторые файлы экспорта и выполняет поиск и замену некоторых значений CDATA. Мне нужно извлечь значение из существующей строки и заменить его новой строкой, содержащей это значение.

Например:

  • Искать: <![CDATA[{"original_image":"9","cropped_image":15}]]>

  • Заменить на: <![CDATA[9]]>

  • Где замененная строка содержит значение JUST из "original_image": "9"

Я приличный с Regex и могу получить нужное мне значение с помощью: ^[^\d]*(\d+)

Я просто не уверен, как сделать все остальное, я полагаю, я делаю это с sed или awk. Еще раз спасибо всем, кто хочет помочь.

1 Ответ

2 голосов
/ 19 марта 2020

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

sed -i 's/\(<!\[CDATA\[\)[^][]*"original_image":"\([0-9]*\)[^][]*\(]]>\)/\1\2\3/g' file

См. онлайн-демонстрацию :

s='<![CDATA[{"original_image":"9","cropped_image":15}]]>'
sed 's/\(<!\[CDATA\[\)[^][]*"original_image":"\([0-9]*\)[^][]*\(]]>\)/\1\2\3/g' <<< "$s"
# => <![CDATA[9]]>

Подробности

  • \(<!\[CDATA\[\) - группа 1: <![CDATA[ подстрока
  • [^][]* - 0+ символов, отличных от [ и ]
  • "original_image":" - буквальная подстрока
  • \([0-9]*\) - Группа 2: ноль или более цифр
  • [^][]* - 0+ символов, отличных от [ и ]
  • \(]]>\) - Группа 3: ]]> substring

Шаблон замены \1\2\3 представляет собой объединение трех значений группы.

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