【问题标题】:How to add a line to a stanza if it doesn't exist already如果它不存在,如何将行添加到节
【发布时间】:2019-02-01 18:54:46
【问题描述】:

我有一个如下所示的文件:

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

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

有什么方法可以让我对每个节进行 grep 以查看 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

【问题讨论】:

标签: bash shell awk scripting grep


【解决方案1】:

这一个班轮可以帮助你,至少它可以让你开始:

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

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

【讨论】:

  • 可怕的“pat” :-(。它是一个 regexp,因为你正在使用它,而不是一个“模式”(不管那是什么!),尽管你真的应该正在进行字符串比较index($0,str) 而不是正则表达式,因为您实际上并不希望将任何字符评估为正则表达式元字符。更重要的是,不要依赖$0=$0 ORS 生成一个 awk 将视为非空的字符串,并且非零。仅当您需要将该赋值的结果作为条件评估以避免任何意外后果时,才在条件上下文中使用赋值。在这种情况下,使用{$0=$0 ORS}1,而不仅仅是@ 987654325@.
  • @EdMorton 你的评论总是有价值的!
【解决方案2】:
$ 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

【讨论】:

    【解决方案3】:

    请您尝试关注一下。

    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
    

    【讨论】:

    • @Alan C,如果对您有帮助,请您尝试一下这个解决方案吗?
    【解决方案4】:

    在单行中使用 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
    
    
    $
    

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 2020-04-22
      相关资源
      最近更新 更多