用Bash删除具有特定模式的行

我有一个文件每行一个字/字符。 例:

a abandonado esta estabelecimento o onibus c casa police 

我需要删除特定模式的行(例如模式“esta”)。 我试着用awk

 cat file | awk '!/^esta/' 

但是这个解决scheme也删除了所有模式为"esta""estabelecimento" 。 我只需要删除具有特定模式"esta"行不符合"estabelecimento"

模式"o""a"的线条也会出现同样的问题。 该命令删除以此模式开始的所有行。

简单的使用grep

 grep -v -w esta file 
  • -w选项匹配“仅字”/“确切字”:正是你所需要的
  • -v选项反转匹配:只打印不匹配的行

你的想法是正确的, ^匹配模式的开始,完成匹配$为模式结束,以便整个词匹配,因为它是

 awk '!/^esta$/' file a bandonado estabelecimento o onibus c casa police 

由于你的文件由只有一列的行组成,你可以检查列是否与字符串匹配。

这消除了需要锚点^$

 $ awk '$1 != "esta" {print}' file a abandonado estabelecimento o onibus c casa police 

根据这个问题你也可以用sed来做到这一点 :

 $ cat test.txt a abandonado esta estabelecimento o onibus c casa police 

 $ sed '/^esta$/d' test.txt a abandonado estabelecimento o onibus c casa police 

grep更简单,但sed可以给你更多的灵活性,取决于你的使用情况和舒适度。