라이너를 강타하여 구성 매개변수 변경

라이너를 강타하여 구성 매개변수 변경

다음 구조의 구성 파일이 있습니다.

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- 구현하다의식과그것;

관련 정보