이것은 훌륭한 답변입니다. https://stackoverflow.com/a/6739327/15603477 하지만 여전히 약간 혼란스럽습니다.
a
변수가 없으면 awk '/^nameserver/ { printf("nameserver 127.0.0.1\n")} {print}' file2
다음을 얻을 수 있습니다.
# Generated by NetworkManager
domain dhcp.example.com
search dhcp.example.com
nameserver 127.0.0.1
nameserver 10.0.0.1
nameserver 127.0.0.1
nameserver 10.0.0.2
nameserver 127.0.0.1
nameserver 10.0.0.3
여러 조합을 시도한 후 사용해야 한다는 것을 알았습니다.
awk '/^nameserver/ && !a { printf("nameserver 127.0.0.1\n"); a=1 } {print}' file2
하지만 반복을 중지하는 기능에 대해서는 !a
여전히 혼란스럽습니다 .a=1
printf("nameserver 127.0.0.1\n")
답변1
변수 이름을 명확하게 지정하십시오 already_inserted
. a
그러면 다음과 같이 읽혀집니다:
if my_pattern matches and not already_inserted { insert "some text"; already_inserted=true; }
awk
이 명령은 각 줄에 대해 실행됩니다.
답변2
"플래그 변수"라고 하는 이러한 변수를 사용하여 프로그램에 특정 조건이 충족되었음을 알리고 해당 값에 따라 추가 처리를 결정합니다. 이는 설정되지 않고 0 또는 null 값(awk 기본 변수 값정수 비교를 수행할 때는 0, 문자열 비교를 수행할 때는 빈 문자열), 문자열이 인쇄되고 a=1
플래그가 설정되므로 이제 0이 아닌 값이기 때문에 중복 추가가 중지됩니다.
많은 프로그래밍 언어에서 !
(not)은 명령문의 평가를 무효화하고 처럼 사용되면 ! a
변수의 평가를 무효화합니다 a
. if a=0
는 ! a
1과 if so 를 반환합니다 a=1
.