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に変換する方法をまだ理解できません。どんな助けでも素晴らしいでしょう。
使用 -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'
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
時々これは回避策としても役立つかもしれません:
str=$(grep -Poh "pcre-pattern" file)
sed -i "s/$str/$something_else/" file
-o、-only-matching:一致する行の一致する(空でない)部分のみを出力し、そのような各部分を別々の出力行に出力します。
複数行の場合は0を使用してください! Perl -0pe's/search/replace/gms 'ファイル