![sed - 不附加新行 EOF 并替换未定义的字母](https://linux22.com/image/62341/sed%20-%20%E4%B8%8D%E9%99%84%E5%8A%A0%E6%96%B0%E8%A1%8C%20EOF%20%E5%B9%B6%E6%9B%BF%E6%8D%A2%E6%9C%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E5%AD%97%E6%AF%8D.png)
我在使用 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
全面披露:我还没有测试过这些解决方案。