特定の単語の後に行が設定されていない場合にのみ行を追加する方法

特定の単語の後に行が設定されていない場合にのみ行を追加する方法

次の行を追加するために、次のsed cliを構築しました。

force_https_protocol=PROTOCOL_TLSv1_2

ラインの後ろ:

[security]

sed コマンドラインインタフェース:

sed  -i '/\[security\]/a force_https_protocol=PROTOCOL_TLSv1_2'  /etc/ambari-agent/conf/ambari-agent.ini

しかし、問題は - 行がforce_https_protocol=PROTOCOL_TLSv1_2 すでに後ろにあるときです。[security]

すでに存在する場合は、行の追加を無視するようにsed構文をどのように変更できますか?

期待される出力

[security]
force_https_protocol=PROTOCOL_TLSv1_2
keysdir=/var/lib/ambari-agent/keys
server_crt=ca.crt
passphrase_env_var_name=AMBARI_PASSPHRASE

無効なファイル:

[security]
force_https_protocol=PROTOCOL_TLSv1_2
force_https_protocol=PROTOCOL_TLSv1_2
keysdir=/var/lib/ambari-agent/keys
server_crt=ca.crt
passphrase_env_var_name=AMBARI_PASSPHRASE

ベストアンサー1

ファイル内のすべての「force_https_protocol=PROTOCOL_TLSv1_2」が[security]タグ内にあり、他の場所には表示されないとします。

sed -e '/^force_https_protocol=PROTOCOL_TLSv1_2$/d'\
    -e '/\[security\]/a force_https_protocol=PROTOCOL_TLSv1_2' file

アイデアは、文字列 "force_https_protocol=PROTOCOL_TLSv1_2"のみを含むファイルのすべての行を削除することです。

説明する

/^force_https_protocol=PROTOCOL_TLSv1_2$/d'

"force_https_protocol=PROTOCOL_TLSv1_2" 文字列を含むすべての行を削除します。

テスト

$ cat file
[security]
force_https_protocol=PROTOCOL_TLSv1_2
keysdir=/var/lib/ambari-agent/keys
server_crt=ca.crt
passphrase_env_var_name=AMBARI_PASSPHRASE

[security]
keysdir=/var/lib/ambari-agent/keys
server_crt=ca.crt
passphrase_env_var_name=AMBARI_PASSPHRASE

$ sed -e '/^force_https_protocol=PROTOCOL_TLSv1_2$/d'\
      -e '/\[security\]/a force_https_protocol=PROTOCOL_TLSv1_2' file
[security]
force_https_protocol=PROTOCOL_TLSv1_2
keysdir=/var/lib/ambari-agent/keys
server_crt=ca.crt
passphrase_env_var_name=AMBARI_PASSPHRASE

[security]
force_https_protocol=PROTOCOL_TLSv1_2
keysdir=/var/lib/ambari-agent/keys
server_crt=ca.crt
passphrase_env_var_name=AMBARI_PASSPHRASE

おすすめ記事