答え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などの構造化文書形式を処理するのに十分ではありません。これらの形式は特定のデータエンコーディングを必要とする可能性があるため、常に行で区切られるわけではありません。