명령줄에서 텍스트 파일에 저장된 변수의 숫자 값을 변경해야 합니다.
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
%s
Vi에서는 "전역 검색 및 교체"를 의미합니다. 검색 패턴은 로 시작하고 VARIABLE=
그 뒤에 하나 이상의 숫자( )가 오는 줄을 찾은 \d+
다음 숫자를 3
여기 예제에서 선택한 변수의 새 값인 로 바꿉니다. 부품 VARIABLE=
이 다시 생산 라인에 투입됩니다.\1
역참조.
이를 차선책으로 만드는 몇 가지 약점이 있습니다.
Vim은 이와 같은 간단한 작업을 수행하기에는 상당히 강력한 프로그램입니다. 이렇게 하면
vi
전체 화면 인터페이스가 잠깐 깜박이는 것을 볼 수 있습니다. 이것은 낭비입니다. 우리는 더 잘할 수 있습니다.Vim은 아래 대안만큼 널리 배포되지 않으며, 우리는 전통적인 Vi 버전에는 존재하지 않을 것 같은 Vim의 세 가지 기능을 사용합니다.버클리또는솔라리스
vi
: 정규식\d
의 역참조 및 다중 플래그-c
.Vim은 이런 종류의 문제를 해결하는 데 적합하지 않기 때문에 여기에 명시적인 "저장 및 종료" 옵션(
-c wq
)이 필요합니다. 이는 아래 대안으로 더욱 간결하게 표현됩니다.
보다 효율적이고 이식 가능한 옵션은 다음을 사용하는 것입니다 sed
.
$ sed -i -e 's/^\(VARIABLE=\)[0-9][0-9]*/\13/' The_Generator.c
귀하가 사용하고 있는 시스템이 다음을 사용할 수 있는 경우POSIX 확장 정규식sed
via 에서는 -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 -E
Perl 정규 표현식이 POSIX 확장 RE보다 강력하기 때문에 대안보다 짧습니다 .
여기서 가장 큰 차이점은 Perl이 역참조를 처리하는 방식입니다. 일반적 $NUM
으로 대신 구문으로 제공 \DIGIT
하지만 숫자도 숫자이므로 대체 텍스트와 구분하기 위해 숫자를 중괄호 안에 넣습니다. 대괄호가 없으면 Perl은 역참조 #13을 찾고 일치하는 텍스트를 찾지 않으므로 원하는 것을 수행할 수 없습니다.
sed
이런 일 때문에 Awk를 선호하는 분들도 계시는데 저 옵션보다 짧고 Perl 옵션보다 빠른 표현은 생각이 안 나네요 .