web-dev-qa-db-ja.com

PCRE正規表現からSEDへ

PCRE正規表現を取得してSEDで使用しようとしていますが、いくつかの問題が発生しています。この質問はより大きな問題(PCRE正規表現をSEDで動作するように変換する方法)を表すため、質問は以下の例だけでなく、SED正規表現全体でPCRE正規表現を使用する方法についてであることに注意してください。

この例では、行から電子メールアドレスを抽出し、それを「[emailaddr]」に置き換えています。

echo "My email is [email protected]" | sed -e 's/[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}/[emailaddr]/g'

私は次の置換正規表現を試しました:

([a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4})
[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}
([a-zA-Z0-9]+[@][a-zA-Z0-9]+[.][A-Za-z]{2,4})
[a-zA-Z0-9]+[@][a-zA-Z0-9]+[.][A-Za-z]{2,4}

概説したように、sedの区切り文字をs/find/replace/gからs | find | replace | gに変更してみました ここ(スタックオーバーフロー:pcreregexからsedregex)

SEDでPCRE正規表現を使用する方法、またはPCRE正規表現をSEDに変換する方法をまだ理解できません。どんな助けでも素晴らしいでしょう。

15
Sugitime

使用 -rフラグ 拡張正規表現 の使用を有効にします。 (-E の代わりに -r onOS X

echo "My email is [email protected]" | sed -r 's/[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[A-Za-z]{2,4}/[emailaddr]/g'

イデオネデモ

17
hwnd

PCREが必要([〜#〜] p [〜#〜] erl [〜#〜] c [〜#〜]互換性がない[〜#〜] r [〜#〜]通常[〜#〜] e [〜#〜] xpressions)?代わりにPerlを使用してみませんか?

Perl -pe 's/[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}/[emailaddr]/g' \
    <<< "My email is [email protected]"

出力:

My email is [emailaddr]

teeを使用してファイルに出力を書き込みます。

Perl -pe 's/[a-zA-Z0-9]+[@][a-zA-Z0-9]+[\.][A-Za-z]{2,4}/[emailaddr]/g' \
    <<< "My email is [email protected]" | tee /path/to/file.txt > /dev/null
14
Rockallite

GNU sedは 基本的な正規表現 または、-rフラグ、 拡張正規表現

POSIX基本正規表現としての正規表現(mklement0に感謝):

[[:alnum:]]\{1,\}@[[:alnum:]]\{1,\}\.[[:alpha:]]\{2,4\}

この式はnotすべての電子メールアドレスと一致しないことに注意してください(ロングショットではありません)。

8
glenn jackman

時々これは回避策としても役立つかもしれません:

str=$(grep -Poh "pcre-pattern" file)
sed -i "s/$str/$something_else/" file

-o、-only-matching:一致する行の一致する(空でない)部分のみを出力し、そのような各部分を別々の出力行に出力します。

0
aderchox

複数行の場合は0を使用してください! Perl -0pe's/search/replace/gms 'ファイル

0
user3505444