Regex&Sed / Perl:他の単語が前に来ない単語の一致

Regex&Sed / Perl:他の単語が前に来ない単語の一致

特定の単語が前に出ていないすべての単語を使用またはsed置換したいです。perl

たとえば、映画のプロットを含むテキストファイルがあり、すべての姓をキャラクターの名前に変更したいとします。ただし、名前が姓の直前に来ない場合にのみ該当します。

サンプルテキストは次のとおりです。

John Smith and Jane Johnson talk about Smith's car.

私はそれが次のように見えるようにしたいです:

John Smith and Jane Johnson talk about John's car.

これにより、次のsed 's/Smith/John/' fileようになります。

John John and Jane Johnson talk about John's car.

姓の前の名前は常に同じです。私はJohn Smithandを扱う必要はありませんFrank SmithSmith以前に存在しなかったマッチング方法が必要です。John

ベストアンサー1

これは正規表現が逆に見えるすべての言語で簡単です。もちろん、Perlはリストの最初です。

perl -pe 's/(?<!John\W)Smith/John/g' <<< "John Smith and Jane Johnson talk about Smith's car."

弱点は、「ジョン」と「スミス」の間に単語以外の文字が複数あることです。残念ながら、+forなどの数量子は、\W「可変長逆引き参照が実装されていません」というエラーを発生させる可能性があります。

おすすめ記事