如何使用 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 OXFORD 的行。这是我的方法:
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
这不仅检查一行是否包含 male
和 oxford
,而且检查它们是否在适当的字段中。使用 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
丢弃不匹配的行。
这样,我们就可以避免使用awk
或grep
来解决这个问题。
如何使用 sed
合并多个过滤器?
这是我的数据集
sex,city,age male,london,32 male,manchester,32 male,oxford,64 female,oxford,23 female,london,33 male,oxford,45
我想识别所有包含 MALE AND OXFORD 的行。这是我的方法:
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
这不仅检查一行是否包含 male
和 oxford
,而且检查它们是否在适当的字段中。使用 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
丢弃不匹配的行。
这样,我们就可以避免使用awk
或grep
来解决这个问题。