我正在练习我的 sed 和正则表达式,并尝试将下面文件中的所有“欢呼”实例替换为 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
我不明白为什么第一项“欢呼”被留下了。
谢谢
答案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