【问题标题】:How to find a pattern using sed?如何使用 sed 找到模式?
【发布时间】:2015-05-30 23:24:41
【问题描述】:

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

这是我的数据集

性别、城市、年龄
男性,伦敦,32
男,曼彻斯特,32
男,牛津,64
女性,牛津,23
女性,伦敦,33
男,牛津,45

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

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

谢谢

【问题讨论】:

    标签: unix command-line sed


    【解决方案1】:

    您可以使用awk

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

    它使用锚这个词来防止撞到女性。

    【讨论】:

      【解决方案2】:

      您可以将块与第一个检查相关联,然后将第二个放入其中。例如:

      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
      

      【讨论】:

      • 这也命中了female
      • OP没有说字段1,字段2确实包含这个词,就像用MALE AND OXFORD获取行一样,但是对于他的数据集应该没问题。
      • 我在推断有关数据结构的事情,这是真的,但如果我的推断是正确的,那么在我看来,对字段进行测试是一个更明智的测试。
      • sed '/^male,oxford,/!d' file 为我工作。如果数据集看起来像sex,city,agemale,london,32 male,manchester,32 male,oxford,64 female,oxford,23 female,london,33 male,oxford,45,为什么它不适用于 csv 文件
      • MacOS X 带有 BSD sed,这对于最基本的东西之外的任何事情都会变得很痛苦。我的建议是使用awk -F, 'tolower($1) == "male" &amp;&amp; tolower($2) == "oxford"' file
      【解决方案3】:

      可以使用单个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来解决这个问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2021-12-24
        • 1970-01-01
        相关资源
        最近更新 更多