답변1
실제로 REGEX 모드를 사용하여 이 작업을 직접 수행할 수는 없지만 printf
옵션을 사용하여 공백과 빈 문자열을 사용하여 왼쪽 비트를 수행할 수 있습니다.
sed "/pattern/a$(printf '\%12s')SystemCgroup = .../" file
백분율 기호는 이스케이프되어야 합니다.
답변2
TOML 파서를 사용하십시오 tomlq
(https://kislyuk.github.io/yq/):
tomlq -t '.plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.SystemdCgroup |= true' config.toml
tomlq
내부 편집을 위해 --in-place
해당 (또는) 옵션 과 함께 사용합니다.-i
위에 사용된 표현식은 문서 구조의 특정 키를 값으로 설정하는 표현식( 래퍼 ) tomlq
입니다 .jq
tomlq
jq
true
문서의 공백은 문서 구조의 유효성에 중요하지 않습니다.
일반적으로 sed
이전 줄과 동일한 들여쓰기 깊이로 텍스트 줄을 삽입하려면 이전 줄의 들여쓰기를 재사용하는 것이 좋습니다.
/^\([[:blank:]]*\)\[.*runc\.options\].*/ {
h
s//\1 SystemdCgroup = true/
H
g
}
스크립트 sed
는 우리가 찾고 있는 특정 섹션 태그와 일치하며 줄 앞의 공백 수를 기억합니다 [
. 예약된 공간에 줄의 복사본을 저장하고 버퍼의 줄을 \1
원래 들여쓰기를 삽입하는 데 사용된 새 데이터로 바꿉니다. 그런 다음 예약된 공간에 버퍼를 추가하고(새 줄 삽입) 예약된 공간을 인쇄할 편집 버퍼로 추출합니다.
그러나 이 sed
도구 및 유사한 라인 기반 도구는 일반적으로 TOML, YAML, JSON 및 XML과 같은 구조화된 문서 형식을 처리하는 데 충분하지 않습니다. 이러한 형식은 특정 데이터 인코딩이 필요할 수 있으므로 항상 줄로 구분되지는 않습니다.