次の行を追加するために、次の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