sed - 新しい行を追加し、未定義の文字を置き換えずにEOF

sed - 新しい行を追加し、未定義の文字を置き換えずにEOF

sedコマンドを使用すると奇妙な動作が発生します(この場合はawkではなくsedでなければなりません)。誰かが私が間違っていることを説明できることを願って、2つの質問があります。

  • 次の行を使用して、/etc/sudoersにコメントと2つのコマンドを追加したいと思います。

    sed -i -e '$a\# Provide apache user permissions to run the ban_ip.sh script as part of mod_evasive\n\apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh\n\Defaults:apache !requiretty' /etc/sudoers
    

    ここで奇妙なことが起こっています。

    • 最初の行(コメント)は、空行を作成せずにファイルの末尾に直接追加されます(修正をリンクしたい「デザインアイテム」のみ)。
    • 生成された2番目の行は、次から始まります。^その波変えるApache

Q:
1. sed one-linerを使用してファイルの末尾に空白行を追加し、空白行の後にテキストを挿入するにはどうすればよいですか?
2.私が欲しいテキストを追加するためにsedを取得するには、1行で何を修正する必要がありますか? (2行目は次から始まります。Apacheまさか^その波

ご意見ありがとうございました。

答え1

なぜなら、この\a役割はCtrl+G- 後でこの役割から抜け出す必要がないからです。\n

メンテナンスのために少し1行にして、実際の改行を使用してコマンドを続行することをお勧めしますa。また、希望の空行もアクティブになります。

sed -i -e '$a\
\
# Provide apache user permissions to run the ban_ip.sh script as part of mod_evasive\
apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh\
Defaults:apache !requiretty' /etc/sudoers

答え2

sedを使用する特別な理由はありますか?なぜできません...

echo -e '\n# Provide apache user permissions to run the ban_ip.sh script as part of mod_evasive\napache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh\nDefaults:apache !requiretty' >>/etc/sudoers

"apache" の最初の "a" は前の "\" にエスケープされて "^Gpache" になります。 「\n」の後にある「\」を削除すると、その特定のケースを解決できます。新しい行でコメントを開始するには、 "$a\" の後に "\n" を挿入します。おそらく...

sed -i -e '$a\ \n# Provide apache user permissions to run the ban_ip.sh script as part of mod_evasive\napache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh\nDefaults:apache !requiretty' /etc/sudoers

完全な開示:私はこれらのソリューションをテストしていません。

関連情報