sedで複数のコマンドを使用して特殊文字を含む文字列の後にテキストを挿入する

sedで複数のコマンドを使用して特殊文字を含む文字列の後にテキストを挿入する

sed構成ファイルで検索と置換を実行する際に問題があります。

-e複数のコマンドを使用し、オプションを使用して以下を実行したいと思います。

  • DBName=.*ステップ1:ファイルに最初に表示される行を見つけて、次に置き換えます。DBName=localhost
  • DBName=.*存在しない場合
    • ステップ2:# DBNAME=.*ファイルに最初に表示される行を見つけ、文字列の下に行を挿入します。DBName=localhost
  • # DBNAME=.*存在しない場合
    • ステップ3:DBName=localhostファイルの下部に挿入

構文が最初に登場したときに混乱しました。また、#文字列の後に続く「スペース」が# DBNAME=私を混乱させます。

ベストアンサー1

これを使用してください:

sed -e '/^DBName=.*/{s/^DBName=.*/DBName=localhost/;:a;n;ba;q}' \
  -e '/^# DBName=.*/{a \DBName=localhost
  :a;n;ba;q}' -e '$a \DBName=localhost' file

どこ:

  • これ最初 -e文は^DBName=.*^行の先頭から)検索し、見つかった場合は{}括弧内の部分を実行します。これは文字列を検索して置換し、完了すると:aラベルを設定しanパターン空間で次の行を読み取って印刷します。 。ラベルbaに戻るaこれにより、sed残りの行はすべて影響を受けずに印刷されます。この時点でsedコマンドは終了しq、他の式は処理されません。したがって、交換は一度だけ行うことができます。
  • これ第二式は次の行で始まる行を検索し# DBName=.*、見つかった場合は次の行にa追加されます。コマンドの後には何も含めないでください。DBName=localhostコマンドに改行文字が必要です。a追加したら、:a;n;ba;q最初の式と同じことを行います。そうでなければ...
  • ...これ第三式が処理されます。コマンド文字列を使用して、$ファイルの最後の行()に文字列を追加します。aDBName=localhost

おすすめ記事