쉘에서 문자열 일치 후 다음 줄에 12개의 공백을 추가하는 방법은 무엇입니까?

쉘에서 문자열 일치 후 다음 줄에 12개의 공백을 추가하는 방법은 무엇입니까?

이라는 파일이 있습니다 config.toml. runc.options이미지의 강조 표시된 문자열과 일치하는지 확인합니다. "Systemdgroup = true"12개의 공백 뒤에 문자열을 삽입 해야 합니다 . 작동했지만 다음 명령을 시도했습니다.수동흰색 12칸. 다른 방법으로 구현하는 방법은 무엇입니까?

sed -e "/runc.options/a\            SystemdCgroup = true" /etc/containerd/config.toml

여기에 이미지 설명을 입력하세요.

12개의 공백을 입력하는 대신 /s+12직업과 같은 것을 입력하는 것이 가능합니까?

답변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입니다 .jqtomlqjqtrue

문서의 공백은 문서 구조의 유효성에 중요하지 않습니다.


일반적으로 sed이전 줄과 동일한 들여쓰기 깊이로 텍스트 줄을 삽입하려면 이전 줄의 들여쓰기를 재사용하는 것이 좋습니다.

/^\([[:blank:]]*\)\[.*runc\.options\].*/ {
    h
    s//\1  SystemdCgroup = true/
    H
    g
}

스크립트 sed는 우리가 찾고 있는 특정 섹션 태그와 일치하며 줄 앞의 공백 수를 기억합니다 [. 예약된 공간에 줄의 복사본을 저장하고 버퍼의 줄을 \1원래 들여쓰기를 삽입하는 데 사용된 새 데이터로 바꿉니다. 그런 다음 예약된 공간에 버퍼를 추가하고(새 줄 삽입) 예약된 공간을 인쇄할 편집 버퍼로 추출합니다.

그러나 이 sed도구 및 유사한 라인 기반 도구는 일반적으로 TOML, YAML, JSON 및 XML과 같은 구조화된 문서 형식을 처리하는 데 충분하지 않습니다. 이러한 형식은 특정 데이터 인코딩이 필요할 수 있으므로 항상 줄로 구분되지는 않습니다.

관련 정보