Sed продолжайте соответствовать прошлым переводам строки - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь использовать sed, чтобы найти и заменить шаблон регулярного выражения eval_config: {.*}.

У меня есть текстовый файл, который содержит что-то вроде этого:

eval_config: {
  <variable number of lines and contents>
}

И я бы хотел заменить его на что-то вроде этого:

eval_config: {
  <completely different variable number of lines and contents>
}

Так, как я могу сопоставить и заменить это? Использование:

sed -i 's/eval_config: {.*\+}/replacement_text/g' filename похоже останавливается на новых строках.


Подробности:

Я использую sed из ячейки ноутбука Jupyter и создаю новый eval_config в виде многострочной строки Python, например:

filename = 'file.txt'
new_eval_config_example = '''eval_config: {{
  metrics_set: {}
  use_moving_averages: false
  num_examples: {}
}}'''.format(metrics_set, val_count)

!sed -i '/eval_config: .*\+/{re.escape(new_eval_config_example)}/g' {filename}

Обновление

  • <variable number of lines and contents> не будет содержать }
  • не содержит вложенных eval_config
  • Завершение } всегда будет на отдельной линии

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Это, наверное, самый простой способ:

sed '/^eval_config: {/,/^}/c\
replacement\
more replacement' data.txt
0 голосов
/ 22 апреля 2019

попробовал на GNU SED

r='replacement_text'
sed -E "/eval_config:\s*\{/ {N;s/\n[^\}]+/\n<$r>/}" filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...