如何找到与模式匹配的文本?

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

给定以下输入文件:

foo
o.b
bar

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

o.b

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

回答

虽然从表面上看,这似乎是一个有明显答案的简单问题,但实际上并不是因为两个因素:

  1. 这个词pattern有歧义——我们不知道 OP 是要进行正则表达式匹配还是字符串匹配,并且
  2. 这个词match是不明确的 - 我们不知道 OP 是否想要在每一行上进行完全匹配(为了简单起见,考虑行和记录同义)或对特定子字符串(例如“单词”或字段)的完全匹配每行的一部分或其他内容的一行或部分匹配。

这些中的任何一个都会从发布的样本输入中产生预期的输出:

  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,而是使用stringor regexp,无论你是什么意思,以及
  2. 始终说明您希望匹配是在整行还是行的一部分或完整的子字符串(例如单词或字段)或行的子字符串的一部分。

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

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


以上是如何找到与模式匹配的文本?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>