1

数百の awstats 構成ファイルで文字列置換を実行しようとしており、sed を使用してそうしています。ただし、作業パターンを取得するのに問題があります。

具体的には、構成で次の行を変換しようとしています。

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 グルが私を正しい方向に向けてくれませんか?

4

4 に答える 4

3

's' の最初の引数自体が正規表現です。\したがって、特殊文字を (で) エスケープする必要があります。あなたの場合、それらは、、、[およびです。したがって、次のようになります。\.*

sed -i 's/^HostAliases="REGEX\[^\\\.*/HostAliases="REGEX[\./' /etc/awstats/*.conf
sed -i 's/REGEX\[^\\\.\*/REGEX[\./' /etc/awstats/*.conf
于 2011-04-13T16:46:56.353 に答える
1

次のように、特別な正規表現文字もエスケープする必要があります。

sed -i 's/REGEX\[\^\\.\*/REGEX[\\./' /etc/awstats/*.conf
于 2011-04-13T16:47:23.760 に答える
1

これはあなたが意味するものですか?

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

出力:

HostAliases="REGEX[\.example\.com$]"
于 2011-04-13T16:45:46.603 に答える
0

^[などの一部の文字をエスケープするのを忘れました。sed は次のようになります。

sed -e 's/REGEX\[\^\.*/REGEX\[/' -i /etc/awstats/*conf
于 2011-04-13T16:48:55.787 に答える