얼마 전에 비슷한 질문을 했지만 제대로 작동하지 않는 데 어려움을 겪고 있습니다.
다음과 같이 구성 파일 수정을 위한 스크립트를 작성하고 있습니다.
[Thing1]
[[subthingA]]
this = 0
that = string
and = localhost
the = 80
other = 0
thing_ading = /path/to/a/dir
[Thing2]
[[subthingB]]
this = 0
thing_ading = /path/to/dir
here = 0
여기에는 N개의 [사물]이 있으며 일반적으로 동일한 키 및/또는 키/값 쌍의 값이 있으며 [[하위 항목]] 아래의 키/값 쌍은 정확히 8칸 들여쓰기되어 있습니다. 나는 특히 thing_ading
아래의 값을 SubthingB
다른 디렉토리 경로로 변경하는 awk/sed/grep/tr/cut/perl을 사용하여 한 줄짜리 코드를 만들려고 노력하고 있습니다 .
모든 것을 편집할 수 thing_adings
있고 특정 쌍을 타겟팅할 수 있지만 공백으로 인해 문제가 발생합니다.
답변1
sed
이러한 문제를 해결하기 위해 범위 연산자를 사용할 수 있습니다 ,
.
sed -e '
/^\[Thing2]$/,/^$/!b
/^[[:blank:]]\{4\}\[\[subthingB]]/,/^$/s|^\([[:blank:]]\{8\}thing_ading\) = .*|\1 = /YOUR/NEW/PATH/TO/DIR|
' yourinifile
- 먼저 잘못된 범위를 건너뛰고 올바른 범위를 선택합니다.
- 그런 다음 적절한 범위에 있을 때 원하는 thing_ding 변수에 대해 대체를 수행할 수 있습니다.
답변2
이것은 sed
문장입니다:
sed '/[[subthingB]]/,/^ *\[/{/thing_ading =/s_=.*_= /your/path/_}' config_file
블록 만 작업하려면 subthingB
들여쓰기 이후부터 다음 줄까지 [[subthingB]]
모두 처리합니다.[
이제 이 블록의 경우 백슬래시 교체로 인해 읽을 수 없게 되는 것을 방지하기 위해 대신 명령 구분 기호를 사용 thing_ading
하여 행의 주소를 지정하고 교체를 수행합니다 ._
/
s
subthingB
블록에 항목이 있는 것이 보장 되면 thing_ading
다음과 같이 단순화할 수 있습니다.
sed '/[[subthingB]]/,/thing_ading =/{//s_=.*_= /your/path/_}'
내부 주소 지정을 위해 마지막 패턴을 재사용합니다.