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
-i
n-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
첫 번째 필드에서 하위 문자열 및/또는 다른 키워드를 확인하는 것만으로도 충분할 수 있습니다. 위의 내용은 세 번째 필드에 변경 사항이 있는 경우에만 변경됩니다. =
대상을 더 세부적으로 지정하지 않으면 파일의 다른 곳에서 변경될 수 있습니다.