Sed保持匹配过去的换行符

问题描述 投票:1回答:2

我正在尝试使用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似乎停在新线上。


细节:

我正在使用来自Jupyter笔记本单元格的sed并将新的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
  • 终止}将永远是独立的
python sed jupyter multiline
2个回答
1
投票

这可能是最简单的方法:

sed '/^eval_config: {/,/^}/c\
replacement\
more replacement' data.txt

0
投票

尝试过gnu sed

r='replacement_text'
sed -E "/eval_config:\s*\{/ {N;s/\n[^\}]+/\n<$r>/}" filename
© www.soinside.com 2019 - 2024. All rights reserved.