如何使用 sed 查找模式?

How to find a pattern using sed?

如何使用 sed 合并多个过滤器?

这是我的数据集

sex,city,age
male,london,32
male,manchester,32
male,oxford,64
female,oxford,23
female,london,33
male,oxford,45

我想识别所有包含 MALE AND OXFO​​RD 的行。这是我的方法:

sed -n '/male/,/oxford/p' file

谢谢

您可以使用awk

awk -F, '/\<male\>/ && /\<oxford\>/' file
male,oxford,64
male,oxford,45

它使用锚这个词来防止对女性的打击。

您可以将一个块与第一个检查相关联,然后将第二个检查放在那里。例如:

sed -n '/male/ { /oxford/ p; }' file

或反转检查和操作:

sed '/male/!d; /oxford/!d' file

但是,由于(正如@Jotne 指出的那样)包含 female 的行也包含 male 而您可能不想匹配它们,因此至少应修改模式以包含单词边界:

sed -n '/\<male\>/ { /\<oxford\>/ p; }' file
sed '/\<male\>/!d; /\<oxford\>/!d' file

但由于这看起来像是逗号分隔的数据,而且检查可能不是为了测试某人是否上过 male 大学,所以最好使用 awk 进行更严格的检查:

awk -F, ' == "male" &&  == "oxford"' file

这不仅检查一行是否包含 maleoxford,而且检查它们是否在适当的字段中。使用 sed 通过使用

可以实现相同的效果,但不太漂亮
sed '/^male,oxford,/!d' file

一个sed命令可以解决这个问题。让我们看一下使用 sed:

的两种变体
$ sed -e 's/^\(male,oxford,.*\)$//;t;d' file
male,oxford,64
male,oxford,45
$ sed -e 's/^male,oxford,\(.*\)$//;t;d' file
64
45

两者本质上是一样的regex:

^male,oxford,.*$

有趣的功能是捕获组放置(整行或仅年龄部分)和使用 ;t;d 丢弃不匹配的行。

这样,我们就可以避免使用awkgrep来解决这个问题。