Vim을 사용하여 스크립트에서 파일의 숫자 값을 변경하세요.

Vim을 사용하여 스크립트에서 파일의 숫자 값을 변경하세요.

명령줄에서 텍스트 파일에 저장된 변수의 숫자 값을 변경해야 합니다.

Bash에서 스크립트 작성을 시도했지만 너무 많은 성공을 거두었습니다.

#!/bin/bash
clear
vim The_Generator.c

(This is hopefully where I modify the The_Generator.c file).

-c 'wq'

답변1

Vim이 이 작업을 수행하는 가장 좋은 방법은 아니지만 가능합니다:

$ vim -c '%s/^\(VARIABLE=\)\d\+/\13/' -c wq The_Generator.c

%sVi에서는 "전역 검색 및 교체"를 의미합니다. 검색 패턴은 로 시작하고 VARIABLE=그 뒤에 하나 이상의 숫자( )가 오는 줄을 찾은 \d+다음 숫자를 3여기 예제에서 선택한 변수의 새 값인 로 바꿉니다. 부품 VARIABLE=이 다시 생산 라인에 투입됩니다.\1 역참조.

이를 차선책으로 만드는 몇 가지 약점이 있습니다.

  1. Vim은 이와 같은 간단한 작업을 수행하기에는 상당히 강력한 프로그램입니다. 이렇게 하면 vi전체 화면 인터페이스가 잠깐 깜박이는 것을 볼 수 있습니다. 이것은 낭비입니다. 우리는 더 잘할 수 있습니다.

  2. Vim은 아래 대안만큼 널리 배포되지 않으며, 우리는 전통적인 Vi 버전에는 존재하지 않을 것 같은 Vim의 세 가지 기능을 사용합니다.버클리또는솔라리스vi: 정규식 \d의 역참조 및 다중 플래그 -c.

  3. Vim은 이런 종류의 문제를 해결하는 데 적합하지 않기 때문에 여기에 명시적인 "저장 및 종료" 옵션( -c wq)이 필요합니다. 이는 아래 대안으로 더욱 간결하게 표현됩니다.

보다 효율적이고 이식 가능한 옵션은 다음을 사용하는 것입니다 sed.

$ sed -i -e 's/^\(VARIABLE=\)[0-9][0-9]*/\13/' The_Generator.c

귀하가 사용하고 있는 시스템이 다음을 사용할 수 있는 경우POSIX 확장 정규식sedvia 에서는 -E명령을 Vim의 명령보다 짧게 만들 수 있습니다.

$ sed -E -i -e 's/^(VARIABLE=)[0-9]+/\13/' The_Generator.c

이를 통해 백슬래시 몇 개를 제거하고 "하나 이상의 숫자"를 더 간결하게 표현할 수 있습니다.

효율성이 가장 중요하지 않은 경우 다음을 통해 더 많은 표현력을 얻을 수 있습니다.Perl 학교 관용어:

$ perl -pi -e 's/^(VARIABLE=)\d+/${1}3/' The_Generator.c

sed -EPerl 정규 표현식이 POSIX 확장 RE보다 강력하기 때문에 대안보다 짧습니다 .

여기서 가장 큰 차이점은 Perl이 역참조를 처리하는 방식입니다. 일반적 $NUM으로 대신 구문으로 제공 \DIGIT하지만 숫자도 숫자이므로 대체 텍스트와 구분하기 위해 숫자를 중괄호 안에 넣습니다. 대괄호가 없으면 Perl은 역참조 #13을 찾고 일치하는 텍스트를 찾지 않으므로 원하는 것을 수행할 수 없습니다.

sed이런 일 때문에 Awk를 선호하는 분들도 계시는데 저 옵션보다 짧고 Perl 옵션보다 빠른 표현은 생각이 안 나네요 .

관련 정보