sed を使用して、2 つの空行の前にテキストを挿入します。

sed を使用して、2 つの空行の前にテキストを挿入します。

注釈付きの構成ファイルを更新するためにsedを使用しようとしています。すべてをEOFに置くのではなく、すべてを別々に維持しようとします。私の設定は次のとおりです。

# SECTION ONE
data...
data...
data...
<insert line here>

# SECTION TWO
data...
data...

最初のセクションの末尾に行を挿入しようとしていますが、「\ n」を許可せずにパターンに複数の「^ $」を含めることができないため、検索パターンを作成するのに問題があります。私は次のようなものが欲しい:

sed -i "/^\n\n# SECTION TWO.*/i data..." somefile.conf

    or

sed -i "/^$^$# SECTION TWO.*/i data..." somefile.conf

他の提案も歓迎しますが、可能であれば一行にしたいと思います。これは大きなスクリプトの一部です。 Python、Perlなどを使用するのは非常に簡単であることを知っていますが、これを「シェル」ソリューションとして維持したいと思います。

ベストアンサー1

awk代わりに使用してくださいsed

newdata='This is the new data'

newdata=$newdata awk -F '\n' -v OFS='\n' -v RS= -v ORS='\n\n' \
    '$1 == "# SECTION ONE" { $(NF+1) = ENVIRON["newdata"] }; 1' file

または

newdata='This is the new data'

newdata=$newdata awk '
    BEGIN { FS = OFS = "\n"; RS = ""; ORS = "\n\n" }
    $1 == "# SECTION ONE" { $(NF+1) = ENVIRON["newdata"] }; 1' file

awk入力レコード区切り文字にNULL値を使用して「段落読み取りモード」に入ります。RSつまり、awk一度に1段落ずつ読みます。 「段落」は、1つ以上の空行で区切られた行の集まりです。

次に、入力フィールド区切り文字を改行FS文字に設定して、段落の各行-F '\n'が独自のフィールドになるようにします。

また、レコード(段落)は末尾の空白行に出力され、フィールド(段落内の行)は改行の終わりに出力されるように出力にORS関連する変数を設定します。OFS

実際のコードは、段落の最初の行が正確に文字列の場合を検出します# SECTION ONE。この場合、新しいデータを含む現在のレコードの末尾に新しいフィールドが追加されます。新しいデータはnewdata環境変数から取得されます。

変更の有無にかかわらず、すべての段落は無条件に出力されます。

参考にしてください実際質問には見えない構成ファイルは、XML、YAML、JSON、またはその他の構造化文書形式で作成され、答えは次のとおりです。無効、対応する文書形式など必要読み取りおよび書き込みに適した形式認識ツール(行指向ではなくデータをエンコード/デコードする必要があるため)

おすすめ記事