我需要解析一个文本文件并替换它的特定部分。我相信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 命令替换所有内容。此时应读取包括 {.*} 在内的整个语句。
谢谢大家的帮助