문자열의 시작 부분을 일치시킨 다음 bash에서 패턴을 사용하여 특정 값을 바꾸는 방법

문자열의 시작 부분을 일치시킨 다음 bash에서 패턴을 사용하여 특정 값을 바꾸는 방법
vm0 host=10.182.35.1 controller=True
vm1 host=10.182.35.2 controller=False solution=abc
vm2 host=10.182.35.3 controller=True solution=abc
vm3 host=10.182.37.4 controller=False solution=xyz
vm4 host=10.182.37.5 controller=True solution=abc
vm5 host=10.182.35.6 controller=True solution=aaa
vm6 host=10.182.37.7 controller=False solution=bbb

위의 테스트가 파일에 있습니다 file1.txt. 다음과 같이 변경하고 싶습니다.

  • 처음 3개의 VM에 대해서는 controller=True.
  • 모든 후속 VM(세 번째 VM부터 시작)은 controller=False.

위에 제공된 코드 조각에는 앞뒤에 뭔가가 있기 때문에 줄 번호를 사용하여 이 작업을 수행할 수 없습니다.

문자열의 시작 부분을 일치시키고 그에 따라 변경해야 합니다.

그래서 출력은 다음과 같아야합니다

vm0 host=10.182.35.1 controller=True
vm1 host=10.182.35.2 controller=True solution=abc
vm2 host=10.182.35.3 controller=True solution=abc
vm3 host=10.182.37.4 controller=False solution=xyz
vm4 host=10.182.37.5 controller=False solution=abc
vm5 host=10.182.35.6 controller=False solution=aaa
vm6 host=10.182.37.7 controller=False solution=bbb

파일을 변경하는 방법은 무엇입니까?

답변1

나는 다음을 사용할 것이다 perl:

perl -pe 's/controller=\K\w+/++$n <= 3 ? "True" : "False"/e if /^vm\d+\s/' file

-in-place 파일 편집 i옵션이 추가되었습니다 .

답변2

awk패턴의 시작이 일치하면 플래그를 설정하고 시작 줄을 변수에 유지할 수 있습니다.

그런 다음 플래그 자체의 발생과 해당 행 번호 수에 따라 변경 사항이 적용됩니다.

awk '$1=="vm0" {a=NR}
     a && NR<a+3 {sub(/=.*/,"=True",$3)}
     a && NR>=a+3 {sub(/=.*/,"=False",$3)}
     1' infile

언제 중지할지에 대한 힌트를 정의하지 않았지만 vm첫 번째 필드에서 하위 문자열 및/또는 다른 키워드를 확인하는 것만으로도 충분할 수 있습니다. 위의 내용은 세 번째 필드에 변경 사항이 있는 경우에만 변경됩니다. =대상을 더 세부적으로 지정하지 않으면 파일의 다른 곳에서 변경될 수 있습니다.

관련 정보