【问题标题】:How do I find the text that matches a pattern?如何找到与模式匹配的文本?
【发布时间】:2021-04-13 16:59:25
【问题描述】:

注意:这不是任何现有问题的重复,它旨在说明为什么这样一个极其常见且看似简单的问题是无法回答的,并提供有关发布此类问题的人如何将其修改为的指导让他们负责,这样我们就不必几乎每天都在 cmets 中提供相同的指导,而只需参考这个即可。

给定以下输入文件:

foo
o.b
bar

我需要输出与模式 o.b 匹配的所有行,所以我的预期输出是:

o.b

我已经尝试过awk '"o.b"' file,但它输出了所有行(这部分只是为了避免抱怨问题中没有发布任何尝试的解决方案)。

【问题讨论】:

    标签: awk


    【解决方案1】:

    虽然表面上这似乎是一个简单的问题,但实际上并不是因为两个因素:

    1. pattern 这个词不明确 - 我们不知道 OP 是要进行正则表达式匹配还是字符串匹配,并且
    2. match 这个词是模棱两可的 - 我们不知道 OP 是否希望在每一行上进行完全匹配(考虑 line 和 record 同义词以简化此答案)或对特定子字符串进行完全匹配(例如“词”或字段)在一行或每行的一部分或其他内容的部分匹配。

    其中任何一个都会从发布的示例输入中产生预期的输出:

    1. awk '/o.b/' file
    2. awk '/^o.b$/' file
    3. awk 'index($0,"o.b")' file
    4. awk '$0 == "o.b"' file

    但我们不知道哪个是正确的,如果有的话,我们只知道它们从问题中的特定样本输入产生预期的输出。

    如果 OP 的真实数据包含像这样的额外字符串,而不仅仅是问题中显示的最小示例,请考虑每个人的行为:

    $ cat file
    foo
    foo.bar
    foobar
    o.b
    orb
    bar
    

    那么这里有 4 个可能的答案,在给定问题的样本输入的情况下,它们都会产生预期的输出,但在输入略有不同的情况下会产生非常不同的输出,而且我们无法从问题中知道哪个输出会满足 OP 的需求:

    1. 部分正则表达式匹配:
    $ awk '/o.b/' file
    foo.bar
    foobar
    o.b
    orb
    
    1. 全行正则表达式匹配:
    $ awk '/^o.b$/' file
    o.b
    orb
    
    1. 部分字符串匹配:
    $ awk 'index($0,"o.b")' file
    foo.bar
    o.b
    
    1. 整行字符串匹配:
    $ awk '$0 == "o.b"' file
    o.b
    

    当您考虑针对每行上的特定子字符串进行全字、全字段和其他类型的匹配时,还有各种其他可能性也可能是正确答案。

    因此,每当您询问有关将某些文本与其他文本匹配的问题时:

    1. 永远不要使用pattern这个词,而是使用stringregexp,无论你是什么意思,并且
    2. 始终说明您希望匹配是整行还是行的一部分或完整的子字符串(例如单词或字段)或行的子字符串的一部分。

    否则,您最终可能会找到解决您没有的问题的解决方案,该解决方案可能效率低下和/或完全错误,即使它为您现在运行的某些特定输入集产生预期输出,它也可能稍后在与其他输入集运行时回来咬你。

    有关此问题的更多示例,另请参阅 https://unix.stackexchange.com/a/631532/133219

    【讨论】:

    • Ed,我收藏了这个..很好的参考..提供清晰和关注细节..
    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 2021-01-12
    • 1970-01-01
    • 2017-07-19
    • 2020-08-05
    • 2021-03-22
    • 2020-08-11
    相关资源
    最近更新 更多