
sed
構成ファイルで検索と置換を実行する際に問題があります。
-e
複数のコマンドを使用し、オプションを使用して以下を実行したいと思います。
DBName=.*
ステップ1:ファイルに最初に表示される行を見つけて、次に置き換えます。DBName=localhost
DBName=.*
存在しない場合- ステップ2:
# DBNAME=.*
ファイルに最初に表示される行を見つけ、文字列の下に行を挿入します。DBName=localhost
- ステップ2:
# DBNAME=.*
存在しない場合- ステップ3:
DBName=localhost
ファイルの下部に挿入
- ステップ3:
構文が最初に登場したときに混乱しました。また、#
文字列の後に続く「スペース」が# 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
ラベルを設定しa
、n
パターン空間で次の行を読み取って印刷します。 。ラベルba
に戻るa
これにより、sed
残りの行はすべて影響を受けずに印刷されます。この時点でsed
コマンドは終了しq
、他の式は処理されません。したがって、交換は一度だけ行うことができます。 - これ第二式は次の行で始まる行を検索し
# DBName=.*
、見つかった場合は次の行にa
追加されます。コマンドの後には何も含めないでください。DBName=localhost
コマンドに改行文字が必要です。a
追加したら、:a;n;ba;q
最初の式と同じことを行います。そうでなければ... - ...これ第三式が処理されます。コマンド文字列を使用して、
$
ファイルの最後の行()に文字列を追加します。a
DBName=localhost
答え2
sed -i 's/DBName=.\*/DBName=localhost/g' -e 's/\# DBNAME=.*/DBName=localhost/g' config_file
最初の2つの条件を満たしています。