사람이 유지 관리하는 다음 Java 속성 파일이 있습니다.
# file.input = /very/old/name
# file.input = /old/name
file.input = /current/name
file.input.default = /default/name
other.file.input = /current/other/name
# Other comments
other.properties = must stay the same
다른 파일을 건드리지 않고 이 파일을 편집하려면 스크립트를 만들어야 합니다. 따라서 구성 파일에 새 속성을 덤프할 수 없습니다.
종종 사람들은 나중에 사용하기 위해 한 줄을 복사/붙여넣고 주석을 달곤 합니다. 내 애플리케이션은 주석을 건드리지 않고 구성 파일을 구체적으로 편집해야 합니다.
이 특별한 경우에는 주석 줄을 건드리지 않고 다른 속성( , ) 을 건드리지 않고 file.input
값을 로 설정하도록 줄을 편집하고 싶습니다 . 내 스크립트는 인간이 일반적으로 하는 것처럼 역사적 목적을 위해 현재 줄을 유지하지 않습니다. 또한 key 에 설정된 현재 값을 모릅니다 ./new/name
file.input.default
other.file.input
file.input
나는 어디에 갇혀 있습니까? 처음에는. 나는 Bash 전문가가 아니며 명령을 순차적으로 호출하고 때로는 일부 if를 사용하는 것 외에는 거의 사용하지 않습니다. 하지만 그게 다야.
perl
정규식을 사용할 수 있지만 이 시스템에는 Perl이 설치되어 있지 않은 것 같습니다. 그래서 차례대로 차례대로 돌려보지만 sed
아무런 결과도 얻지 못합니다. 특정 값을 다른 값으로만 바꿀 수 있는 것 같습니다. 파일 읽기로 래핑한 다음 변경할 수 있는 의도한 줄을 제외하고 다시 쓸 수 있습니다. 게다가 바꾸고 싶은 집 앞에 인위적으로 추가된 공간도 도저히 감당할 수 없었다.
그러니 다른 옵션이 있다면 공유해 주세요. 제가 멀어지기 시작했기 때문입니다.
답변1
sed
-i 옵션을 사용하십시오(제자리에서 편집). 경고는 교체 명령을 구분하는 데 사용되는 문자가 NEW 문자열에 나타나서는 안 된다는 것입니다. 이 예에서는 '/' 대신 ':'을 사용하여 ( s:old_string:new_string:
) 를 구분합니다.
NEW=/new/name
sed -i 's:^[ \t]*file.input[ \t]*=\([ \t]*.*\)$:file.input = '${NEW}':' f
답변2
솔루션 용도 awk
:
$ awk -F'=' '$1 ~ /^[ \t]*file.input[ \t]*$/{$2="= /new/name"}{print}' config
# file.input = /very/old/name
# file.input = /old/name
file.input = /new/name
file.input.default = /default/name
other.file.input = /current/other/name
# Other comments
other.properties = must stay the same
그런 다음 새 구성 파일에 저장할 수 있습니다.
awk -F'=' '$1 ~ /^\s*file.input\s*$/{$2="= /new/name"}{print > "new_config"}' config
답변3
크로스 플랫폼 작업을 위해 스크립트에서 이를 사용해야 하는 경우(MacOSX에서도 작동함) -i
백업 파일 확장자를 제공하는 full 플래그를 사용해야 합니다.
NEW=/new/thing
sed -i.backup 's|\s*file.input\s*=.*$|file.input = '${NEW}'|' filename
## Then you can check exit code and remove the backup file if all is well
## rm filename.backup
그렇지 않으면 MacOSX에서 "명령 끝 부분에 추가 문자가 있습니다"와 같은 오류가 발생합니다.