私は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]
なければならない文字と一致します。i
n
g
あなたの質問を「返信のインスタンスを完全な単語に置き換える」に置き換えると、単語の境界マークを使用して次のことができます\b
。
sed 's/\bcheer\b/lalaland/g'
答え2
この式は、、またはを除くすべての[^ing]
単一文字を表します。したがって、一致する(または一致しない)他の文字がないため、スタンドアロンの場合は一致するものはありません。i
n
g
cheer[^ing]
cheer
達成したいことは否定的な予測つまり、長さゼロのアサーションは、後に続くcheer
場合を除いて一致します。ひも ing
。単純ではありませんが、sed
構文を使用すると比較的簡単です。perl
(?!ing)
perl -pe 's/cheer(?!ing)/lalaland/g' test
lalaland
cheering
.
word
lalalandytree
alalalandytree