使用Bash

时间:2016-12-30 17:47:24

标签: linux bash awk sed

我有一个文件,每行有一个单词/字符。例如:

a
abandonado
esta
estabelecimento
o
onibus
c
casa
police

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

cat file | awk '!/^esta/' 

但是此解决方案也删除了带有模式"esta""estabelecimento"的所有行。我只需要删除特定模式"esta"不符合"estabelecimento"的行。

包含模式"o""a"的行会出现同样的问题。该命令将删除所有以此模式开头的行。

4 个答案:

答案 0 :(得分:7)

使用grep简单:

grep -v -w esta file
  • -w选项匹配“仅限单词”/“确切单词”:正是您需要的内容
  • -v选项反转匹配:仅打印不匹配的行

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

这消除了对锚^$

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

答案 3 :(得分:2)

您也可以根据this问题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可以为您提供更大的灵活性,具体取决于您的使用案例&每个人的舒适程度。