シェルで文字列を一致させた後、次の行に12個のスペースを追加する方法は?

シェルで文字列を一致させた後、次の行に12個のスペースを追加する方法は?

というファイルがありますconfig.tomlrunc.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パーサーを使用してくださいtomlqhttps://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などの構造化文書形式を処理するのに十分ではありません。これらの形式は特定のデータエンコーディングを必要とする可能性があるため、常に行で区切られるわけではありません。

関連情報