sed 模式和多行替换

sed 模式和多行替换

我需要解析一个文本文件并替换它的特定部分。我相信sed是这样做的方法,但不确定如何用它处理多行

我正在寻找的模式是

set cells { \  
cell1 \  
cell2 \  
cell3 \  
}

我想用变量的内容替换它。

像下面这样的东西应该可以解决问题,但它不适用于多行。有任何想法吗?

sed "s/set cells {.*}/set cells {$cell_variable}/" file

答案1

如果必须是sed

sed -i.bak ':a;N;$!ba;s/set cells {.*}/set cells{\n'$cell_variable'\n}/g' file
  • -i.bak内联编辑之前创建原始文件的备份。
  • :a创建标签a以跳回。
  • N将下一行输入追加到模式空间中。
  • $!如果不是最后一行...
    • ba跳回标签a
  • s///g搜索并替换模式

一个更简单的解决方案perl

perl -0777 -i.bak -pe "s/set cells \{.*\}/set cells{\n$cell_variable\n}/igs" file
  • -0777导致 perl 吞掉整个文件。
  • -i.bak内联编辑之前创建原始文件的备份。

答案2

我想避免将 perl 作为额外的工具来使用。由于某种原因,我无法使混沌解决方案发挥作用,但是在 sed 上阅读了一些内容后,我想出了一个替代方案,在这里

sed "/set cells/!b; :Loop; N; /}/!b Loop; s/.*/set cells {$cell_def}/" -i file
  • /set cells/!b:查找设置的单元格,如果没有找到则转到下一行
  • :Loop:用于合并多行的标签
  • N: 追加下一行
  • /}/!b Loop:寻找},如果没有找到则返回标签Loop。实际上,循环会读取新行,直到找到 }
  • s/.*/set cells {$cell_def}/:用我自己的 set cells 命令替换所有内容。此时应读取包括 {.*} 在内的整个语句。

谢谢大家的帮助

相关内容