sed - 不附加新行 EOF 并替换未定义的字母

sed - 不附加新行 EOF 并替换未定义的字母

我在使用 sed 命令时遇到了奇怪的行为(在这种情况下必须是 sed,没有 awk),并向您提出两个问题,希望有人有能力向我解释我做错了什么。

  • 我想使用以下一行向 /etc/sudoers 附加一条注释和两个命令:

    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
    

    这里发生了奇怪的事情:

    • 第一行(注释)直接附加在文件末尾,而不创建空行(只是我要链接修复的“设计内容”)
    • 创建的第二行现在开始于^Gpache代替阿帕奇

问题:
1. 如何使用 sed 单行代码将空行附加到文件末尾,然后在该空行之后插入我的文本?
2. 我需要在一行中修复什么才能让 sed 添加我想要的文本(第二行以阿帕奇并不是^Gpache

非常感谢您的意见。

答案1

因为这个\a角色是Ctrl+G——你不需要在之后转义这个角色\n

为了可维护性,我建议稍微减少它的单行性,并使用实际的换行符来继续命令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

全面披露:我还没有测试过这些解决方案。

相关内容