web-dev-qa-db-ja.com

sedによって指定された無効な先行正規表現

私はsedスクリプトファイルで作業しており、実行すると「無効な先行正規表現」エラーが発生します。以下はファイル全体です。

私はこれについて、このサイトと他の場所の両方ですでに多くの検索を行っています。ここで尋ねられた多くの質問の結果、正規表現を拡張したり、何かが誤ってエスケープされたりする必要が生じました。電子メールの置換に必要なため、これを拡張表現としてすでに定義しました。

#!/bin/sed -rf
#/find_this thing/{
#s/ search_for_this/ replace_with_this/
#s/ search_for_this_other_thing/ replace_with_this_other_thing/
#}

#Search and replace #ServerAdmin (with preceding no space) email addresses using a regular expression that has the .com .net and so on domain endings as option so it will find root@localhost and replace it in line with admin's email address.

ServerAdmin/ { 
s/\b[A-Za-z0-9._%-]+@(?:[a-zA-Z0-9-]+\.)+(\.[A-Za-z]]{2,4})?\b/[email protected]/
}
#Enable user's Public HTML directories
/UserDir/ {
s/disable$/enable/ 
s/^#User/User/
}
#Replace the only #ServerName (with preceding no space) followed space and text with Our server ip
/#ServerName */ c\ ServerName server.ip.address.here/

私はそれを./config-Apache.sed /etc/httpd/conf/httpd.confとしてtermalから呼び出し、これを返します。

/bin/sed: file ./Apache-install.sed line 12: Invalid preceding regular expression

vim行12の内側は、}の上に単一の#Enable user's Public HTML directoriesとして識別されます。

13
Spartan-196

GNU sedはPCRE非捕捉表記が好きではないようです:

...(?:...)...

試してください:

s/\b[A-Za-z0-9._%-]+@([a-zA-Z0-9-]+\.)+(\.[A-Za-z]]{2,4})?\b/[email protected]/

GNU sedはそれで問題ないようです。ただし、まだやるべきことが少しあります。以下の最初の行を入力として、出力は2行目です。

abc [email protected] aaa
abc [email protected] aaa

その結果をもたらす2つの問題があります。

  1. ]]は単一の]
  2. 前の正規表現で末尾のドットを探しているため、ドメインサフィックスの最後の部分にドットが必要ではありません。

これは仕事をします:

s/\b[A-Za-z0-9._%-]+@([a-zA-Z0-9-]+\.)+([A-Za-z]{2,4})?\b/[email protected]/

abc [email protected] aaa
abc [email protected] aaa
19