用字符串替换一行或创建一个不存在的新字符串-sed

时间:2018-09-05 15:08:22

标签: regex bash sed

我想替换'DUMP ='行或如果某个块中不存在则添加新行。当从[text]到下一个[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

1 个答案:

答案 0 :(得分:1)

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),而该块没有{{1} }条目(DUMP=),写一个。
  • f==0 :: 如果我们位于正确的块(s&&/^ *DUMP=/{$0=" DUMP=example"; f=1})中,并且找到了s==1条目,请对其进行更新。