그래서 아래와 같은 파일이 있습니다.
#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:]]*//g
undefine의 정의(및 주석)를 제거합니다.G
라인을 다시 추가하고 이번에는 재정의합니다.s|//||g
마지막으로 네 줄의 주석을 모두 제거하십시오.