2011-04-13 68 views
1

我試圖在數百個awstats配置文件上執行字符串替換,並使用sed來執行此操作。但是,我無法獲得工作模式。無法找到工作的sed模式

具體而言,我想這條線轉換在configs:

HostAliases="REGEX[^\.*example\.com$]" 

到這一點:

HostAliases="REGEX[\.example\.com$]" 

其中example\.com是變種。

我試過幾十個sed命令的變體。例如:

sed -i 's/^HostAliases="REGEX[^\.*/HostAliases="REGEX[\./' /etc/awstats/*.conf 

sed -i 's/REGEX[^\.*/REGEX[\./' /etc/awstats/*.conf 

但每次得到這樣的錯誤:sed: -e expression #1, char 49: unterminated 's' command

的問題是,可能與一些轉義字符做,但我不能找出哪些或如何逃脫他們。我想使模式具體到足以避免意外地匹配配置中的其他行,因此包括HostAliases會很好。

請問一些sed大師請指點我正確的方向嗎?

回答

3

的第一個參數 'S' 本身是一個正則表達式。所以你必須逃脫(與\)的特殊字符。在你的情況下,他們是[,\,.*。因此,它應該是:

sed -i 's/^HostAliases="REGEX\[^\\\.*/HostAliases="REGEX[\./' /etc/awstats/*.conf 
sed -i 's/REGEX\[^\\\.\*/REGEX[\./' /etc/awstats/*.conf 
+0

謝謝,你的回答讓我想到正確的方式,所以我可以解決我自己的問題。我需要的實際sed命令是'sed -i's/^ HostAliases =「REGEX \ [^ \\\。\ */HostAliases =」REGEX [\\ ./'/ etc/awstats/*。conf'。我正在授予最佳解釋的觀點。 – 2011-04-13 20:32:35

1

這是你的意思嗎?

$ echo 'HostAliases="REGEX[^\.*example\.com$]"' | sed 's/^HostAliases=\"REGEX\[\^\\\.\*/HostAliases="REGEX[\\\./' 

輸出:

HostAliases="REGEX[\.example\.com$]" 
+0

+1爲工作的答案和教我一個更好的調試方法。我接受了Jan的答案,因爲它教會了我爲什麼。 – 2011-04-13 20:38:51

1

你需要轉義特殊正則表達式字符太,像這樣:

sed -i 's/REGEX\[\^\\.\*/REGEX[\\./' /etc/awstats/*.conf 
+0

作品。不清楚爲什麼。 – 2011-04-13 20:46:05

0

你忘了逃避一些字符,像^[。 你的sed會是這樣的:

sed -e 's/REGEX\[\^\.*/REGEX\[/' -i /etc/awstats/*conf 
+0

不完全正確,但一開始。謝謝。 – 2011-04-13 20:44:09