sed - 如何排除匹配中的多个模式

sed - 如何排除匹配中的多个模式

我目前有一套 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"

相关内容