検索パターンを介して行区切り文字で - で区切られたコンテンツを削除します。

検索パターンを介して行区切り文字で - で区切られたコンテンツを削除します。

次の入力を含むファイルがあります。

----------
          ID: alternatives_create_editor
    Function: alternatives.install
        Name: editor
      Result: None
     Comment: Alternative will be set for editor to /usr/bin/vim.basic with priority 100
     Started: 10:45:49.115459
    Duration: 0.78 ms
     Changes:
----------
          ID: hosts_1
    Function: host.present
        Name: ip6-allnodes
      Result: None
     Comment: Host ip6-allnodes (ff02::1) already present
     Started: 10:45:49.127667
    Duration: 1.117 ms
     Changes:

----------
          ID: sfrsyslog_fix_logrotate
    Function: file.managed
        Name: /etc/logrotate.d/rsyslog
      Result: None
     Comment: The file /etc/logrotate.d/rsyslog is set to be changed
     Started: 10:45:50.771278
    Duration: 12.751 ms
     Changes:
----------

私の目標は、すでに存在するComment:includeセクション全体を削除することです。

私は努力したgrep -B 5 -A 4 'already present' FILE1 > FILE2

次に、

diff -y FILE1 FILE2 | grep '<' | sed 's/

この出力では以下のような結果が得られます。

          ID: alternatives_create_editor
    Function: alternatives.install
        Name: editor
      Result: None
     Comment: Alternative will be set for editor to /usr/bin/
     Started: 10:45:49.115459
    Duration: 0.78 ms
     Changes:

----------
          ID: sfrsyslog_fix_logrotate
    Function: file.managed
        Name: /etc/logrotate.d/rsyslog
      Result: None
     Comment: The file /etc/logrotate.d/rsyslog is set to be
     Started: 10:45:50.771278
    Duration: 12.751 ms
     Changes:
----------

問題は、Comment: section完全な行が提供されないことです。助けてください。ありがとう

答え1

より簡単な方法は、単一のGNU awkコマンドを使用することです。

awk 'BEGIN{RS=ORS="----------\n"};!/Comment:[^\n]*already present/' file

レコード区切り記号を10のダッシュに設定し、ダッシュがComment:[^\n]*already present含まれている場合はレコードを抑制します。[^\n]*「改行ではありません」を意味するため、レコードにalready presentinがChanges:含まれているがinを含まない場合、そのレコードは表示されませんComment:

出力:

----------
          ID: alternatives_create_editor
    Function: alternatives.install
        Name: editor
      Result: None
     Comment: Alternative will be set for editor to /usr/bin/vim.basic with priority 100
     Started: 10:45:49.115459
    Duration: 0.78 ms
     Changes:
----------
          ID: sfrsyslog_fix_logrotate
    Function: file.managed
        Name: /etc/logrotate.d/rsyslog
      Result: None
     Comment: The file /etc/logrotate.d/rsyslog is set to be changed
     Started: 10:45:50.771278
    Duration: 12.751 ms
     Changes:
----------

GNU awk がない場合、POSIX はマルチキャラクタレコード区切り文字の動作を定義しないため、上記の内容が機能しない可能性があります。だから私は次のポータブル代替品を残しました。

awk '/Comment:.*already present/{p=1}
    /^-{10}$/{
        if(p!=1){printf "%s",lines}
        p=0
        lines=""
    }
    {lines=lines $0 RS}
' file

答え2

別のawk解決策:

awk 'BEGIN{RS=ORS="----------\n"} $0 !~ /already present/' file

関連情報