이전에 다른 사용자가 awk를 사용하여 내가 하고 있던 일을 수정하는 데 도움을 주었습니다. 여기서는 모든 파일의 어느 곳에서나 문자열을 검색하고 문자열이 발견되면 같은 줄에 있는 두 개의 숫자를 바꾸었습니다.
awk -i inplace '/^gene_height/{ $3=sprintf("%.0f",(169+rand()*51));$5=sprintf("%.0f",(169+rand()*51)) }1' *
이것은 내가 만든 테스트 파일에서 작동하지만(읽을 태그가 훨씬 적음) 실제 파일에서는 Crusader Kings 모드를 변경하려고 합니다. 구성 파일의 모든 줄이 공백으로 시작하고 두 개의 탭으로 시작하기 때문에 차단됩니다. . gene_height 앞에 있는 "^"를 제거하려고 시도했는데 효과가 있었지만 파일에서 공백과 두 개의 탭이 제거되어 형식이 엉망이 되고 모드가 중단될 수 있습니다.
위 스크립트가 공백, 탭 두 개, "gene_height" 문자열로 시작하는 파일을 읽고 교체할 때 공백과 탭 두 개를 유지하는 방법을 아는 사람이 있습니까?
답변1
탭, 공백, 세로 탭을 바꾸려면 [[:space:]]
"t" 또는 "v" 앞에 백슬래시를 사용할 수도 있습니다.
$ echo -e '\t' |cat -vet
^I$
$ echo -e 'x\tx x\vx' | awk '{gsub(/[[:space:]]/, "_"); print}'
x_x_x_x
$ echo -e 'x\tx x\vx' | awk '{gsub(/\t/, "_"); print}'
x_x x
x
$ echo -e 'x\tx x\vx' | awk '{gsub(/ /, "_"); print}'
x x_x
x
$ echo -e 'x\tx x\vx' | awk '{gsub(/\v/, "_"); print}'
x x x_x