sed 仅替换一些字母正则表达式

sed 仅替换一些字母正则表达式

我正在练习我的 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]并不像您想象的那样:它匹配一个字符,该字符必须不是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

前向和后向零长度断言

相关内容