5

次のファイルの [Block B] の後に sed を使用して行を挿入しようとしています。

[Block A]  
line 1  
line 2  

[Block B]  
line 1  
line 2  

[Block C]  
line 1  
line 2  

私が使用したコマンド:

sed '/\[Block B\]/,/^$/a\inserted line' file

正しい/望ましい結果は次のようになります。

[Block B]  
line 1  
line 2  
inserted line  

ただし、代わりにこれを取得しました:

[Block B]  
inserted line  
line 1  
inserted line  
line 2  
inserted line  

sed を使用して目的の結果を得る方法を教えてください。ありがとう!

4

3 に答える 3

12
sed -e '/\[Block B\]/{:a;n;/^$/!ba;i\inserted line' -e '}'
于 2012-06-25T04:26:40.347 に答える
6

私自身の問題の解決策を探しているときに、この質問を見つけました。これは似ていますが、少し異なります。問題を解決するために、ここで回答を調整しました。

次のように、構成ファイル内のブロックの最後にテキストを挿入する必要がありました。

name1 {
    ...
}

name2 {
    ...
    inserted text line 1
    inserted text line 2
}

name3 {
    ....
}

これを達成するために、上から @toyntz のコメントを取得し、次のように適応させました。

/^name2 {/,/^}/{
    /^}/i\    inserted text line 1
    /^}/i\    inserted text line 2
}

それは単なる sed 式です。ファイルに入れ、次のsed -fように実行できます。

$ sed -f sed_expression data_file

name2 {この最初の式は、行の先頭から始まり、同じく行の先頭で終わる行の範囲を検索します}。これにより、作業するブロックが選択されます。{残りの式は中かっこで囲まれ}、選択された範囲で動作します。これには、挿入したい行ごとに 1 つのコマンドが含まれており、それぞれに、行に一致する式があり、その後にテキスト行を挿入するための挿入操作が/^}/続きます。ii後に a が続く\ため、先頭の空白も挿入されます。

次に、式をもう少し進めて、2 つの挿入コマンドを 1 つに置き換えました。

/^name2 {/,/^}/{
    /^}/i\
    inserted text line 1\
    inserted text line 2
}

ここでは、1 つのコマンドで挿入されるテキストが次の 2 行にまたがっています。\1 つのコマンドを継続するために、最初の行の追加の末尾に注意してください。

次に、1行に減らしました。乱雑で読みにくくなりますが、それでも機能します。

/^name2 {/,/^}/{/^}/i\    inserted text line 1\n    inserted text line 2
}

挿入される 2 つの行は改行で区切られます\n。賢明な読者は、実際には 2 行あることに気付くでしょう。最初の行の最後に右中括弧を配置することはできません。これが、上記の他の回答に 2 番目の -e 式がある理由です。したがって、上記は私ができる最善のことでした。それを bash コマンド ラインで表すには、次のようにします。

sed -e '/^name2 {/,/^}/{/^}/i\    inserted text line 1\n    inserted text line 2' -e '}' data_file

テキストのブロックの最後に挿入しようとしている人に、それを実現するために sed 式をどのように書くことができるかを説明できることを願って、この手書き文字を書きました。Sed の式は非常にわかりにくく、理解するのが難しい場合があります。私の説明がその点で役立つことを願っています。

于 2013-03-15T17:17:39.473 に答える
0

これはうまくいくかもしれません(GNU sed):

sed '/^\[Block B\]/,/^$/!b;/^$/i\inserted line' file
于 2013-09-17T15:03:05.070 に答える