대화형 편집기 없이 구성 파일 값을 편집하기 위한 명령줄

대화형 편집기 없이 구성 파일 값을 편집하기 위한 명령줄

Key value많은 프로필은 형식 이나 Key=value프로필당 한 줄을 기반으로 합니다 . 많은 소프트웨어 패키지는 이러한 사용 가능한 구성 키가 기본값으로 작성 및/또는 주석 처리된 기본 구성 파일을 제공합니다.

sed대화형 편집기를 열지 않고 그보다 높은 수준 (아마도 그 위에 구축됨) 없이 그러한 파일을 변경할 수 있는 도구가 있는지 궁금합니다 .

그것은 간단할 것입니다:

$ conftool file key value

파일에서 키를 찾고, 주석 기호(있는 경우)를 제거하고, 값을 변경하고 결과를 저장합니다.

답변1

내가 아는 한 범용 구성 재배선 도구는 없습니다. 구성 파일 구문이 너무 다양하기 때문에 그러한 도구를 만드는 것이 어려울 것이라고 생각합니다.

특정 구성 파일의 특정 값을 변경하려는 경우 해당 특정 작업을 위한 특수 도구를 작성할 수 있습니다.

다음은 시작하기 위해 sed와 awk를 사용하는 두 가지 예입니다.

key value키 값을 간단한 구문으로 바꾸는 간단한 sed 명령

$ sed 's/^key2 value2$/key2 newvalue2/' config 

$ cat config 
key1 value1
key2 value2
key3 value3

$ sed 's/^key2 value2$/key2 newvalue2/' config 
key1 value1
key2 newvalue2
key3 value3

하지만 주의하세요. 더 많은 줄이 있으면 key2 value2(아마도 구성 파일의 다른 부분에) 모든 줄이 교체됩니다. 이는 sed에서는 방지하기 어렵지만(가능하지만 어렵습니다) awk에서는 더 쉽습니다. 축제를 존중하는 awk 명령은 아래를 참조하세요.

설명하다:

이 sed 명령은 대략 다음을 수행합니다.

for every line:
  if line is "key2 value2":
    print "key2 newvalue2"

이 sed 명령의 의미는 다음과 같습니다 . s/pattern/replace/각 줄에서 검색하고 pattern, 발견되면 일반 문자열 또는 정규식(정규식)일 수 있습니다.replacepattern

정규식의 ^합계를 &기준점이라고 하며 각각 선의 시작과 끝을 나타냅니다. 앵커가 없으면 패턴 key2 value2도 라인과 일치하며 xkey2 value2x결과는 입니다 xkey2 newvalue2x.

다음은 패턴을 사용하여 행동을 변경하는 방법에 대한 몇 가지 예입니다.

key=value문법 에도 적용

$ sed 's/^key2=value2$/key2=newvalue2/' config 

이전 값과 상관없이 키만 일치

$ sed 's/^key2=.*/key2=newvalue2/' config 

가능한 주석 플래그 제거

$ sed 's/^#\?key2 value2$/key2 newvalue2/' config 

출력을 리디렉션하면 stderr로 인쇄하여 변경된 사항이 있는지 확인할 수도 있습니다.

$ sed 's/^#\?key2 value2$/key2 newvalue2/ w /dev/stderr' config > newconfig

올바른 정규식을 사용하면 더 많은 일을 할 수 있습니다. 그러나 그것은 또 다른 질문에 대한 또 다른 대답이 될 것입니다.

이것은 구성 부분도 처리하는 awk 스크립트입니다.

/^\[section2\]$/ {
  print
  insection2=1
  next
}
insection2 && /^#?key2=value2$/ {
  print "key2=newvalue2"
  next
}
/^\[.*\]$/ {
  insection2=0
}
1

이렇게 사용하세요

$ awk -f configer.awk config

$ cat config 
[section1]
key1=value1
key2=value2

[section2]
key1=value1
key2=value2

[section3]
key1=value1
key2=value2

$ awk -f configer.awk config 
[section1]
key1=value1
key2=value2

[section2]
key1=value1
key2=newvalue2

[section3]
key1=value1
key2=value2

또한 출력이 리디렉션될 때 변경된 내용을 확인할 수 있도록 stderr에 자세한 출력을 추가할 수도 있습니다.

insection2 && /^#?key2=value2$/ {
  print "key2=newvalue2"
  print "changed line "NR > "/dev/stderr"
  next
}

awk 스크립트에 대한 간단한 설명

[config2]첫 번째 규칙은 섹션 제목을 찾습니다 . insection2플래그를 true로 설정 합니다 .

두 번째 규칙은 해당 줄을 찾습니다 key2=value2. 그러나 insection2플래그가 참인 경우에만 가능합니다. 그런 다음 새 값이 포함된 행을 인쇄합니다.

세 번째 규칙은 다른 섹션 제목을 찾습니다. insection2플래그를 false로 재설정 합니다 .

마지막 규칙(그리고 유일한 규칙 1)은 "기본 규칙"입니다. 행을 변경하지 않고 인쇄합니다.

의사코드로

for every line:
  if line is [section2]:
    note that we are in section2
  else if we are in section2 and line is key2=value2:
    print modified line
  else if line is any other section header:
    note that we are no longer in section2
  else
    print line unchanged

관련 정보