RE:ファイル内の特定の文字列の後にテキストを挿入するには?

RE:ファイル内の特定の文字列の後にテキストを挿入するには?

参照リンク:ファイルの特定の文字列の後にテキストを挿入するには? 次の入力ファイルがあります。

Some text
Random
[option]
Some stuff

「[オプション]」の前に1行のテキストを追加したいです。

Some text
Random
Hello World
[option]
Some stuff

このコマンドは次のとおりです。

sed  '/\[option\]/i Hello World' input

動作します
が、次のコマンドは次のとおりです。

perl -pe '/\[option\]/i Hello World' input

動作しません。
同等のperlコマンドは何ですか?

修正する:

@terdonと@Sundeepのおかげで、次の部分的な解決策を見つけました。

perl -lpe 'print "Hello World" if /^\[option\]$/' input

しかし、毎回挿入するのではなく、「[オプション]」に初めて触れるときにのみテキスト文字列を挿入したいと思います。
たとえば、

Some text
Random
[option]
Some stuff
test1
[option]
test2

次のようになります。

Some text
Random
Hello World
[option]
Some stuff
test1
Hello World
[option]
test2

いいえ:

Some text
Random
Hello World
[option]
Some stuff
test1
[option]
test2

私が望むように。

答え1

Perlのアプローチは次のとおりです。

$ perl -ne 'if(/\[option\]/){print "*inserted text*\n"}; print' input
Some text
Random
*inserted text*
[option]
Some stuff

より簡潔な別の内容は次のとおりです。

 $ perl -ne '/\[option\]/?print "*inserted text*\n$_":print' input
Some text
Random
*inserted text*
[option]
Some stuff

これを行うには、ファイル全体をメモリに読み込む必要があります。

$ perl -0777 -pe 's/\[option\]/*inserted text*\n$&/' input 
Some text
Random
*inserted text*
[option]
Some stuff

答え2

@terdonと@Sundeepに感謝!私が探しているテーブルは次のとおりです。

perl -lpe 'print "Hello World" if /^\[option\]$/' input

修正する:

毎回挿入するのではなく、「[オプション]」に初めて会ったときだけテキスト文字列を挿入したいと思います。
私は解決策を見つけました:

perl -lpe 'print "Hello World" if /^\[option\]$/ && ++$i == 1' input

テキストを追加するには、次のコマンドを使用できます。

perl -lpe '$_ .= "\nHello World" if /^\[option\]$/ && ++$i == 1' input

&& は if の AND で、「++」または「--」は 1 を加算または減算することを意味します。変数i(他の変数である可能性があります)は、デフォルトでは0から始まり、増分はプレフィックス表記であるため、変数が最初に増分され、次に最初の比較が実行されることを意味します。この構文は、コマンドを私が想像したよりも非常に柔軟で強力にします。 「&&」は「and」より優先順位が高いです。第2の条件は、第1の条件が満たされた場合にのみ評価される。したがって、この場合、一致する場合にのみ変数の値が増加して比較されます。

関連情報