如何使用sed查找模式?

时间:2015-03-26 19:16:57

标签: unix command-line 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

由于

3 个答案:

答案 0 :(得分:4)

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

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, '$1 == "male" && $2 == "oxford"' file

这不仅检查一行是否包含maleoxford,还检查它们是否在相应的字段中。通过使用

,可以通过sed实现相同的目标
sed '/^male,oxford,/!d' file

答案 1 :(得分:1)

您可以使用awk

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

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

答案 2 :(得分:0)

可以使用单个sed命令命令来解决此问题。我们来看看使用sed的两种变体:

$ sed -e 's/^\(male,oxford,.*\)$/\1/;t;d' file
male,oxford,64
male,oxford,45
$ sed -e 's/^male,oxford,\(.*\)$/\1/;t;d' file
64
45

两者都具有基本相同的regex

^male,oxford,.*$

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

通过这种方式,我们可以避免使用awkgrep来解决此问题。