다음과 같이 구성 파일 수정을 위한 스크립트를 작성하고 있습니다.
[purple]
auth = no
enabled = 0
username =
password =
priority = 0
host = True
[shovel]
group =
manual = False
enabled = 0
username =
여기에는 많은 [범주]가 있으며 때로는 키/값 쌍과 동일한 키가 포함되어 있습니다.
"enabled=0" 값을 "enabled=1"로 변경하는 awk/sed/grep/tr/cut/perl을 사용하여 한 줄짜리 코드를 만들 수 있습니까? 단, 카테고리 [shovel]에 대해서만 가능합니까?
답변1
범위를 사용할 sed
수 있습니다(범주 끝의 빈 줄에서 중지 [shovel]
).
sed '/\[shovel\]/,/^$/ s/enabled = 0/enabled = 1/' file
첫 번째 부분은 /\[shovel\]/,/^$/
을 사용하여 줄을 찾고 [shovel]
, 빈 줄을 찾을 때까지 계속 진행한 다음 s/old/new
해당 부분(이 경우 간단한 부분)에서만 다음 명령을 실행하는 것을 의미합니다.file
주석에 대한 응답 참고 사항: sed
범위 및 주소의 대체 구분 기호는 앞에 백슬래시가 없으면 허용되지 않습니다(따라서 /
일치해야 하는 경우 리터럴이어야 하는 모든 문자를 이스케이프하세요). 다음 명령에서는 언제든지 대체 구분 기호를 사용할 수 있습니다. 예를 들면 다음과 같습니다.
sed '/\[shovel\]/,/^$/ s|enabled = 0|enabled = 1|' file
또는
sed '\|\[shovel\]|, |^$| s|enabled = 0|enabled = 1|' file
답변2
구성이 다음과 같다고 가정하고 Perl을 사용하는 솔루션은 다음과 같습니다 config.ini
.
perl -000 -n -i -e 's/^enabled = 0$/enabled = 1/m if /^\[shovel\]\n/; print;' config.ini
이는 다음을 수행합니다.
-000
$/ = "\n\n";
- 기본적으로 코드와 동일하게 단락 모드에서 파일을 읽습니다.-n
- 루프 내에서 지정된 코드를 실행합니다while (<>) { }
.-i
- 표준 출력으로 인쇄하는 대신 지정된 파일을 인라인으로 편집합니다. 선택적으로 확장자를 지정할 수 있으며, 그러면 입력 파일이 해당 확장자로 백업됩니다. 예를 들어 ,-i.bak
.config.ini.bak
-e
- 지정된 Perl 코드를 실행합니다.
코드 자체는 입력 "단락" 자체가 한 줄에서 시작하면 대체 항목에 enabled = 0
정확히 동일한 줄이 포함된다고 말합니다. 정규식에서 특별한 의미를 갖는 경우가 많기 때문에 이스케이프해야 합니다.enabled = 1
[shovel]
[
]
답변3
이 awk 솔루션을 사용해 볼 수 있나요?
awk '/shovel/{flag=1}flag&&/enabled/{$NF=1;flag=0}1' input
답변4
sed
특정 행에 대한 수정을 제한할 수 있습니다 .
sed -i '3s/enabled = 0/enabled = 1/g' file
이렇게 하면 라인 3[보라색]만 수정됩니다.