ファイルの末尾にコードブロックを挿入して更新する

ファイルの末尾にコードブロックを挿入して更新する

だから、以下のようなファイルがあります。

#ifndef CONFIG_DHCP_H
#define CONFIG_DHCP_H

FILE_LICENCE(GPL2_OR_LATER_OR_UBDL);

#include <config/defaults.h>

#define DHCP_DISC_START_TIMEOUT_SEC 1
#define DHCP_DISC_END_TIMEOUT_SEC 10
//#define DHCP_DISC_START_TIMEOUT_SEC   4   /* as per PXE spec */
//#define DHCP_DISC_END_TIMEOUT_SEC 32  /* as per PXE spec */

/*
 * .
 * .
 * .
 */

#define PXEBS_MAX_TIMEOUT_SEC 3
//#define PXEBS_MAX_TIMEOUT_SEC     7   /* as per PXE spec */

#include <config/local/dhcp.h>

#endif /* CONFIG_DHCP_H */

示されているようにはるかに長いが、...関連部分を強調表示した。次に変更する必要があります

#ifndef CONFIG_DHCP_H
#define CONFIG_DHCP_H

FILE_LICENCE(GPL2_OR_LATER_OR_UBDL);

#include <config/defaults.h>

#define DHCP_DISC_START_TIMEOUT_SEC 1
#define DHCP_DISC_END_TIMEOUT_SEC 10
//#define DHCP_DISC_START_TIMEOUT_SEC   4   /* as per PXE spec */
//#define DHCP_DISC_END_TIMEOUT_SEC 32  /* as per PXE spec */

/*
 * .
 * .
 * .
 */

#define PXEBS_MAX_TIMEOUT_SEC 3
//#define PXEBS_MAX_TIMEOUT_SEC     7   /* as per PXE spec */

#include <config/local/dhcp.h>

#undef DHCP_DISC_START_TIMEOUT_SEC
#define DHCP_DISC_START_TIMEOUT_SEC 4
#undef DHCP_DISC_END_TIMEOUT_SEC
#define DHCP_DISC_END_TIMEOUT_SEC 32

#endif /* CONFIG_DHCP_H */

つまり、一番下に4行を挿入します。ただし、この行はファイルの先頭にも表示されるため、触れてはいけません。これらの行が存在する場合、人々はその値を更新できるはずです。

トップレベルのテストファイルに対する私の試みはdhcp.h以下に保存されました。

#!/bin/bash

dhcp="${1:-dhcp.h}"

read -r -d '' dhcp_regex_timeout <<'EOM'
#undef *DHCP_DISC_START_TIMEOUT_SEC
#define *DHCP_DISC_START_TIMEOUT_SEC *\d+
#undef *DHCP_DISC_END_TIMEOUT_SEC
#define *DHCP_DISC_END_TIMEOUT_SEC *\d+
EOM

read -r -d '' dhcp_correct_timeout <<EOM
#undef DHCP_DISC_START_TIMEOUT_SEC
#define DHCP_DISC_START_TIMEOUT_SEC ${2:-4}
#undef DHCP_DISC_END_TIMEOUT_SEC
#define DHCP_DISC_END_TIMEOUT_SEC ${3:-32}
EOM

echo "${dhcp_correct_timeout}"

if grep -Pazoq "${dhcp_regex_timeout}\n+#endif" "${dhcp}"; then
  # The block is present at the end of the file, time to update it
  sed "s/${dhcp_regex_timeout}/${dhcp_correct_timeout}/"
else
  # The block is NOT present at the end of the file, time to insert it
  sed -E "s/\n*\(#endif .*\)/${dhcp_correct_timeout}\n\n\1/"
fi

どんな提案がありますか?上記のコードは単なるスケッチだけでは機能しませんが、私がやりたいことを示しています。私はこれが仕事をより簡単にすることができるように他の解決策で開いていますawk=)

答え1

コードがまだ存在しない場合は、予約済みスペースを使用してsedコメント付きの定義を収集し、コメントなしで最後に配置してから最初に定義を解放できます。

sed '\|//#define DHCP_DISC_.*_TIMEOUT_SEC|H;\|include <config/local/dhcp.h>|{G;s/define/undef/g;s/ [0-9][[:print:]]*//g;G;s|//||g;}'

したがって、この 1 回sed限りのコマンドだけで他のすべてのコードは必要ありません。詳細:

  • \|//#define DHCP_DISC_.*_TIMEOUT_SEC|Hこの行は、後で使用するために予約されたスペースに追加されます。
  • \|include <config/local/dhcp.h>|新しい行を配置する必要がある行と一致します。すべての追加コマンドは、この行に対してのみ実行されます。
  • G予約されたスペース(保存された行と空の行、これはコードを分離するのに役立ちます)をパターンスペースに追加します。
  • s/define/undef/g定義するよりも定義しないもの
  • s/ [0-9][[:print:]]*//gundefineの定義(およびコメント)を削除します。
  • G行を再度追加し、今回は上書きします。
  • s|//||g最後に、4行のコメントをすべて削除します。

関連情報