sedは一部の文字正規表現のみを置き換えます。

sedは一部の文字正規表現のみを置き換えます。

私はsedと正規表現を練習しており、以下のファイルから「cheer」のすべてのインスタンスをlalalandに置き換えようとしています。ただし、応援のようなものは除外してください。

ubuntu@ip-172-31-58-40:~$ cat test
cheer
cheering
.
word
cheerytree
acheerytree

ubuntu@ip-172-31-58-40:~$ sed -i "s/cheer[^ing]/lalaland/g" test
ubuntu@ip-172-31-58-40:~$ cat te
cat: te: No such file or directory
ubuntu@ip-172-31-58-40:~$ cat test
cheer
cheering
.
word
lalalandtree
alalalandtree

なぜ最初のアイテム「Cheers」が抜けたのか分かりません。

ありがとう

答え1

このパターンはあなたが思うものとは異なります。つまり、またはで[^ing]なければならない文字と一致します。ing

あなたの質問を「返信のインスタンスを完全な単語に置き換える」に置き換えると、単語の境界マークを使用して次のことができます\b

sed 's/\bcheer\b/lalaland/g'

答え2

この式は、、またはを除くすべての[^ing]単一文字を表します。したがって、一致する(または一致しない)他の文字がないため、スタンドアロンの場合は一致するものはありません。ingcheer[^ing]cheer

達成したいことは否定的な予測つまり、長さゼロのアサーションは、後に続くcheer場合を除いて一致します。ひも ing。単純ではありませんが、sed構文を使用すると比較的簡単です。perl(?!ing)

perl -pe 's/cheer(?!ing)/lalaland/g' test
lalaland
cheering
.
word
lalalandytree
alalalandytree

バラより前方と後方の長さがゼロのアサーション

関連情報