Perl

使用 perl/awk/sed 前置字元串?

  • November 25, 2015

我正在嘗試編寫對我的 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

引用自:https://serverfault.com/questions/738970