다음 구조의 구성 파일이 있습니다.
ValueOne = 1
ValueTwo = 2
ValueThree = 3
ValueTwo를 찾아 해당 값을 22222로 변경하는 한 줄의 bash 스크립트를 원합니다.
어떤 아이디어가 있나요? 학교 얘기가 아니잖아
답변1
더 좋은 방법이 있을 거라 확신하지만, 제가 하는 방법은 다음과 같습니다.
구성 파일의 자체 줄에 매개변수가 있는 경우
sed -i '/ValueTwo/s/= .*/= 22222/' config_file
/ValueTwo/
: 문자열을 검색하여ValueTwo
연산할 라인을 찾습니다(주소)s/= .*/= 22222/
: 위 검색과 일치하는 줄= .*
에서= 22222
(바꾸다)= .*
: 검색=
문자 뒤에 공백() 문자가 오고 그 뒤에 0개 이상의 임의 문자(
.*
)가 옵니다.정규식 예)= 22222
:발견된 콘텐츠를 리터럴 문자열로 바꿉니다.= 22222
그러면 config_file의 내용이 대체됩니다. 변경된 매개변수로 새 파일을 생성하려면 삭제 -i
하고 > new_file
줄 끝에 배치하십시오.
구성 파일의 같은 줄에 매개변수가 있는 경우(편집되지 않은 질문에서와 같이):
sed -i 's/ValueTwo = [^ ]*/ValueTwo = 22222/' config_file
이는 또한 config_file의 내용을 대체합니다. ValueT는 매개변수에 공백이 없으면 작동합니다. 이는 매개변수가 자체 라인에 있는 경우에도 작동하지만 이 경우 전자 접근 방식이 더 강력할 수 있습니다.
답변2
perl -p -i.bak -e 's/ValueTwo = 2/ValueTwo = 22222/' path/to/configfile
손가락에 문제가 발생할 경우를 대비해 파일을 그 자리에서 편집하고 원본 파일의 복사본을 저장합니다. awk를 사용하여 동일한 작업을 수행할 수 있습니다.
답변3
나는 다음을 선택할 것이다 awk
:
awk '/ValueTwo/{$3=22222}1;' file > newfile
위 코드는 주어진 행이 ValueTwo와 일치하는지 확인하고 3D 필드를 222
일치하는 행으로 설정합니다. 이것은 1;
awk shgorthand가 작성된 방식이며 print $0
, 모든 줄을 인쇄합니다. 일치하는 블록( ) 외부에 있으므로 /ValueTwo/{}
모든 줄이 인쇄됩니다.
bash 솔루션을 요청했으므로(이 솔루션을 선호하는 이유는 확실하지 않지만 여전히) 다음을 시도해 볼 수 있습니다.
while read key eq val; do
[ $key = "ValueTwo" ] && val=22222
printf "%s %s %s\n" $key $eq $val
done < file
답변4
ex
편집기 사용 (Vi의 일부):
ex +'%s/^ValueTwo[^=]\?=[^0-9]\?\zs[^$]\+/22222/' -scwq config.ini
설명하다:
+cmd
- ex/vi 실행씨주문하다;%s/foo/bar/
-에스구문을 찾아서 바꿉니다.^
- 줄의 시작;[^=]\?=[^0-9]\?
-=
등호( ) 주변 영역을 선택합니다.\zs[^$]
- 라인 끝까지 교체할 부품을 선택합니다./22222/
- 패턴은 (다음의 모든 것\zs
)로 대체됩니다.-s
-에스무음 모드;-c<command>
- 구현하다<command>
;-cwq
- 구현하다승의식과큐그것;