我目前有一套 sed,除了一件事之外,运行良好。
我遇到问题的特定表达是:
sed -i '/[^}.to]\.to[[:space:]]/ s/\(\S\)/expect(\1/' ../_spec_seded/"$file"
现在这工作正常。基本上它会在表达式的开头
查找.to
并插入。expect
特别是,}.to
当寻找匹配.to
哪个作品时,它会排除。
现在我还想从搜索匹配中排除“this”或“that”。就我而言}.to
或者 end.to
即代替
/[^}.to]\.to[[:space]]/
我应该有:
/[^}.to|^end\.to]\.to[[:space]]/
/[^}.to][^end\.to]\.to[[:space]]/
/[(^}.to|end\.to)]\.to[[:space]]/
/[^(}.to|end\.to)]\.to[[:space]]/
如果像这样使用它们,我是否需要转义括号
/[^\(}.to|end\.to\)]\.to[[:space]]/
甚至也是|
?
/[^\(}.to\|end\.to\)]\.to[[:space]]/
我正在努力让比赛顺利进行:
stuff.to do thing
stuff).to do thing
this.to that
all.all.all.to do
pretend.do # Note this edge case! (pretend contains "end"!)
但不上
this will be here }.to do
last.end}.to do
all.this at the end.to
none at allend.to
和
all.this at the
end.to # i.e. no spaces before as it is the start of the line.
通常(所有语言)使用 OR 进行否定似乎很棘手(由于误报)。
答案1
在等待您对我对这个问题的评论做出回应,这是我的答案:
首先,
[^}.to]
没有按照你的想法去做。它会不是匹配没有模式的行}.to
。它匹配具有任何特点除了.
、}
、t
或 之外o
。换句话说,许多线。为了让事情变得更简单,我们默认
sed
不打印任何内容,然后告诉它打印所有内容除了与您要排除的模式匹配的那些行:sed -n '/\(\bend\|}\.to\)/!p' your_file
这将打印所有不包含end.to
在字边界(即allend.to
不计数)或 的行}.to
。
此外,如果您只想打印那些匹配的行\.foo[[:space:]]
,只需删除与不需要的模式匹配的行并添加条件打印:
sed -n '/\(\bend\|}\.to\)/d;/\.to[[:space:]]/p' your_file
当然,在匹配和打印之间,您可以应用任何您喜欢的替换:
sed -n '/\(\bend\|}\.to\)/d;/\.to[[:space:]]/s/foo/bar/g;p' your_file
答案2
对于大多数情况,这似乎有效:
前:
sed -i 's/[^}.to].to[[:space:]]/).to /' ../_spec_seded/"$file"
后:
sed -i 's/[^}.to|end.to].to[[:space:]]/).to /' ../_spec_seded/"$file"