我正在尝试编写对我的 apache 配置文件 (httpd.conf) 的更改的脚本。我正在尝试匹配以下字符串:
#
# DirectoryIndex: sets the file that Apache will serve if a directory
并在前面加上以下文字:
#
# Allow server status reports generated by mod_status,
# with the URL of http://servername/server-status
# Change the ".example.com" to match your domain to enable.
#
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from localhost ip6-localhost 127.0.0.1 192.168.0.0/255.255.255.0
</Location>
我的理解是 sed 不支持多行匹配, awk 似乎很难进行多行匹配。我试图让 perl 与 perl -0777 -pi -e 一起工作,但我似乎无法找出与原始模式匹配的正则表达式。
我更愿意将其作为一个衬里进行 - 而不是脚本,因为我希望它是可移植的(即根据需要复制和粘贴)。
有任何 perl 正则表达式专家可以帮助我设计解决方案吗?
非常感谢布拉德
编辑
以下作品:
sed -i -e ':begin;$!N;s/#\n# DirectoryIndex/#\n# Allow server status reports generated by mod_status,\n# with the URL of http:\/\/servername\/server-status\n# Change the ".example.com" to match your domain to enable.\n#\n<Location \/server-status>\n\tSetHandler server-status\n\tOrder deny,allow\n\tDeny from all\n\tAllow from localhost ip6-localhost 192\.168\.0\.0\/255\.255\.255\.0\n<\/Location>\n\n#\n\#DirectoryIndex/;tbegin;P;D' /etc/httpd/conf/httpd.conf
但是 # 和 DirectoryIndex 之间没有空格。
但是,如果我尝试将其更改为:
sed -i -e ':begin;$!N;s/#\n# DirectoryIndex/#\n# Allow server status reports generated by mod_status,\n# with the URL of http:\/\/servername\/server-status\n# Change the ".example.com" to match your domain to enable.\n#\n<Location \/server-status>\n\tSetHandler server-status\n\tOrder deny,allow\n\tDeny from all\n\tAllow from localhost ip6-localhost 192\.168\.0\.0\/255\.255\.255\.0\n<\/Location>\n\n#\n\# DirectoryIndex/;tbegin;P;D' /etc/httpd/conf/httpd.conf
sed 命令挂起并且永远不会完成。我似乎无法弄清楚为什么?
唯一的区别是# 和 DirectoryIndex 之间有一个空格。
你应该试试
当您在正则表达式工具中使用 / 分隔符时,不要忘记转义您的字符串
replace
(\/
for )/
如果你通过shell运行它,你可以做一个这样的脚本
使用 newConfFile 包含您要添加的虚拟主机配置
这是一个 Bash 函数,用于测试函数是否存在
例如
canExec sed
测试系统上是否存在 sed 命令使用 awk,如何:
这应该对您有用,因为您不需要严格地预先设置文本 - 因为您要查找的文本和要插入的文本都以您开头,
#
您可以保留原始#
文本,插入您的文本减去第一#
行中间,然后打印原始的第二行,然后打印另一#
行作为您没有预先添加的行。你必须填写全文,但这里有足够的东西来说服我它可以工作;)
(我的双引号转义适用于 Windows 的命令提示符。根据需要进行调整)。
编辑的 bash 引用: