awk를 사용하여 파일 중간에 텍스트 줄을 추가하는 방법은 무엇입니까?

awk를 사용하여 파일 중간에 텍스트 줄을 추가하는 방법은 무엇입니까?

이것은 훌륭한 답변입니다. 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=1printf("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! a1과 if so 를 반환합니다 a=1.

관련 정보