如果尚无行,如何将其添加到节中

时间:2019-02-01 18:54:47

标签: bash shell awk scripting grep

我有一个看起来像这样的文件:

[TEST]
Path1 = db/test/testdb
Path2 = db/real/db

[TEST2]
Path1 = db/test/testdb
Path2 = db/real/db
DataSizeMB = 1234

有什么办法可以重复每个节以查看DataSizeMB = 1234是否存在?如果不是,将其添加到节中?

我尝试过的事情:

cat test.txt | awk 'BEGIN{RS=ORS="\n\n";FS=OFS="\n"}/DataSizeMB/'

使用DataSizeMB捕获所有节。我需要grep没有DataSizeMB的所有节并添加行。

示例输出:

[TEST]
Path1 = db/test/testdb
Path2 = db/real/db
DataSizeMB = 1234

[TEST2]
Path1 = db/test/testdb
Path2 = db/real/db
DataSizeMB = 1234

4 个答案:

答案 0 :(得分:1)

这根班轮可能会对您有所帮助,至少它可以让您开始:

awk -v RS="" -v pat="DataSizeMB = 1234"  '!($0~pat){$0=$0 ORS pat}$0=$0 ORS' file

(文件后会附加一个空行。)

答案 1 :(得分:1)

$ awk -v RS= -v ORS='\n\n' -v str='DataSizeMB = 1234' '{print $0 (index($0,str) ? "" : "\n" str)}' file
[TEST]
Path1 = db/test/testdb
Path2 = db/real/db
DataSizeMB = 1234

[TEST2]
Path1 = db/test/testdb
Path2 = db/real/db
DataSizeMB = 1234

答案 2 :(得分:0)

请您尝试以下。

awk -v var="DataSizeMB = 1234"  '
/^\[/ && value{
  if(found){
    print value
  }
  else{
    print value ORS var
  }
  found=value=""
}
$0 ~ var{
  found=1
}
NF{
  value=value?value ORS $0:$0
}
END{
  if(found){
    print value
  }
  else{
    print value ORS var
  }
}'   Input_file

答案 3 :(得分:0)

单行使用Perl段落模式-00就是为了解决这种情况。

perl -00 -lpe ' BEGIN {$t="DataSizeMB = 1234" } $_.="\n$t" if ! /$t/ ' 

带有输入

$ perl -00 -lpe ' BEGIN {$t="DataSizeMB = 1234" } $_.="\n$t" if ! /$t/ ' alanc.txt
[TEST]
Path1 = db/test/testdb
Path2 = db/real/db
DataSizeMB = 1234

[TEST2]
Path1 = db/test/testdb
Path2 = db/real/db
DataSizeMB = 1234


$