首页 > 解决方案 > 逐行替换,如果不存在则创建新的 - sed

问题描述

如果某个块中不存在,我想替换 'DUMP=' 行或添加新行。当块定义由 from[text]直到 next[text]时,例如:

[name]
  sometext=...
  moretext=...
  DUMP=
  moretext2=...    
[name2]
  ...

为了替换现有的线路,我会这样做:

sed -i '/^\['name'\]$/,/^\[/!b
    /DUMP=/cDUMP=example' $file

DUMP=...我不知道是否可以在一两个班轮中,但是如果该块中不存在该选项,我该如何添加添加选项?

示例 1:

file1.txt

[name]
  A=text1
  B=text2
  DUMP=x
  C=text3

[name2]
  A=text12
  B=text22
  DUMP=x2
  C=text32

sed '/^\['name'\]$/,/^\[/!b /DUMP=/cDUMP=example' file1.txt输出:

[name]
  A=text1
  B=text2
  DUMP=example
  C=text3

[name2]
  A=text12
  B=text22
  DUMP=x2
  C=text32

示例 2:

file1.txt

[name]
  A=text1
  B=text2
  C=text3

[name2]
  A=text12
  B=text22
  DUMP=x2
  C=text32

sed '/^\['name'\]$/,/^\[/!b /DUMP=/cDUMP=example <add DUMP incase it doesn't exist>' file1.txt输出:

[name]
  A=text1
  B=text2
  C=text3
  DUMP=example

[name2]
  A=text12
  B=text22
  DUMP=x2
  C=text32

标签: regexbashsed

解决方案


awk '/^\[/&&/]$/&&s&&!f{print "  DUMP=example"; s=0}
     $0 ~ "^\["blockname"]$"{s=1;f=0}
     s&&/^ *DUMP=/{$0="  DUMP=example"; f=1}
     1
     END{if(s&&!f)  print "  DUMP=example"; } blockname="name" <file>

在这里,我们做了以下事情:

  • 变量s检查是否找到正确的块
  • 变量f检查是否在正确的块DUMP=中找到了条目
  • /^\[/&&/]$/&&s&&!f{print " DUMP=example"; s=0}::如果我们输入一个新块,并且前一个块是正确的 ( s==1) 并且该块没有DUMP=条目 ( f==0),则写入一个。
  • s&&/^ *DUMP=/{$0=" DUMP=example"; f=1}::如果我们在正确的块 ( s==1) 中,并且我们找到了一个DUMP=条目,则更新它。

推荐阅读