Perl
使用 perl/awk/sed 前置字元串?
我正在嘗試編寫對我的 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 之間有一個空格。
使用 awk,如何:
將每一行儲存在“上一行”的變數中
如果目前行與您要查找的第二行匹配 (DirectoryIndex),請使用上一行檢查變數
如果他們都匹配
- 列印凹凸
- 列印“目前行”
- 列印吞下的’#'
別的
- 列印目前行
用目前行更新“上一行”變數。
這應該對您有用,因為您不需要嚴格地預先設置文本 - 因為您要查找的文本和您要插入的文本都
#
可以保留原始#
文本,插入您的文本減去第一#
行中間,然後列印原始的第二行,然後列印另一#
行作為您沒有預先添加的行。你必須填寫全文,但這裡有足夠的東西來說服我它可以工作;)
gawk "{if (a==\"#\" && /^# DirectoryIndex/) {print \"# Allow Server\n#With the URL\n#\"; print $0} else {print $0}} {a=$0}" httpd.conf > ??
(我的雙引號轉義適用於 Windows 的命令提示符。根據需要進行調整)。
編輯的 bash 引用:
gawk '{if (a=="#" && /^# DirectoryIndex/) {print "# Allow Server\n# With the URL\n#"; print $0} else {print $0}} {a=$0}' httpd.conf