Замените Sed внутри файла json на регулярное выражение - PullRequest
0 голосов
/ 15 января 2020

У меня есть огромный json файл, я скопирую его часть:

"panels": [
 "targets": [
{
  "alias": "First Prod",
  "dimensions": {
    "Function": "robot-support-dev-create-human"
  },
}
{
  "alias": "Second Prod",
  "dimensions": {
    "Function": "robot-support-prototype-dev-beta-activate-human"
  },
}
{
  "alias": "third Prod",
  "dimensions": {
    "Function": "robot-support-dev-jira-kill-human"
  },
}  
{
   "alias": "Somehting",


 "dimensions": {
    "Robotalias": "default",
    "RobotName": "Robot-prod-prototype",
    "Operation": "Fight"
  },
]
]

Я хочу выполнять регулярное выражение для функции каждый раз, когда она содержит от robot-support-dev до robot-support-prod-...

sed -i ' s/"robot-support-([a-zA-Z0-9_]+)-dev-([^"]+)"/robot-support-\\1-prod-\\2/g;'

Это то, что я сделал, но с моим регулярным выражением что-то не так, может быть

Ответы [ 3 ]

0 голосов
/ 15 января 2020

Как отметил @KamilCuk, есть некоторые проблемы с регулярным выражением, которое вы сейчас используете. Я думаю, что если вхождения, которые вы приводите в качестве примера, являются единственными возможностями, это сработает, если вы сопоставите эти группы:

sed -i 's/"robot-support\(-\|-.*-\)dev-\(.*\)"/"robot-support\1prod-\2"/g'
0 голосов
/ 15 января 2020

Как указано в другом месте на этой странице, использование sed для этого типа проблемы, в лучшем случае, чревато опасностью. Поскольку вопрос был помечен , следует отметить, что jq отлично подходит для такого типа задач. В частности, тривиальное решение может быть получено с использованием фильтра sub арности 2 или 3, то есть sub/3: sub ("FROM"; "TO"; "g").

Вы также можете wi sh для использования walk, так что вам не нужно беспокоиться о том, где именно находятся «функциональные» клавиши, например,

walk( if type == "object" and (.Function|type) == "string"
      then .Function |= sub( "robot-support-(?<a>([^-]+-)?)dev-"; "robot-support-\(.a)prod-"; "g")
      else . end)

0 голосов
/ 15 января 2020

Вы не можете сопоставить json с регулярным выражением. «Правильный путь (TM)» - сначала извлечь Function с помощью инструмента json, например jq, затем изменить его с помощью sed, а затем вставить обратно с помощью инструмента json.

Sed по умолчанию использует basi c regex , поэтому вам нужно изменить ( ) + на \( \) \{1,\} (\+ - это Расширение GNU) или с GNU sed просто используйте sed -E, чтобы использовать расширенное регулярное выражение. Также \\1 будет интерпретироваться как 2 символа \ с 1, вы хотите использовать \1 с одним \. Но в любом случае, ваше регулярное выражение является недействительным и не соответствует тому, что вы хотите (я думаю). Также в правой части строки замены отсутствует ", поэтому ваша команда просто удалит ". Просто замените то, что вам нужно, попробуйте:

sed 's/"robot-support-dev-/"robot-support-prod-/g;'
...