파일 끝에 코드 블록 삽입 및 업데이트

파일 끝에 코드 블록 삽입 및 업데이트

그래서 아래와 같은 파일이 있습니다.

#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;}'

따라서 이 일회성 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마지막으로 네 줄의 주석을 모두 제거하십시오.

관련 정보