この前方予測正規表現 'string.*?(?= )'がsedで機能しないのはなぜですか? [コピー]

この前方予測正規表現 'string.*?(?= )'がsedで機能しないのはなぜですか? [コピー]

次のような長いリストがあります。

AllowedUsers [email protected] [email protected] [email protected] [email protected] .....

すべて1行にあります。デフォルトでは、多くのユーザー名@ip

ユーザー名(例:aaa)を使用して検索と置換を実行し、何でも変更したいと思います。

正規表現をテストしました(正規表現)期待通りに動作します。ただし、この操作を実行しようとすると動作sedしません。

$ sed 's/bbbb11.*?(?= )//' test
AllowedUsers [email protected] [email protected] [email protected] [email protected] .....

私も試してみましたが、うまくbbbb11.*?(?=[[:space:]])いきませんでした。

私が逃したものは何ですか?

答え1

ポジティブ(?=)とマイナスの予測(?!)アサーションは、サポートされているツールでのみ正しく機能します。PCRE拡張。 GNUsedも POSIX も、これらのライブラリ拡張をサポートしていません。perlすぐにサポートが必要です。

perl -pe 's/bbbb11.*?(?= )//'

あるいは、正規表現のサポートなしで同じ目標を達成できます。この簡単な交換のために、POSIXとGNUの両方で動作する次のことができます。sed

sed 's/\(bbbb11[^ ]*\)//'

関連情報