【问题标题】:Search for three words written in different "shapes" using grep使用 grep 搜索以不同“形状”书写的三个单词
【发布时间】:2021-01-25 13:01:21
【问题描述】:

我有一个包含以下内容的文本文件:

**gvožđa gvozda gvozdja
гвожђа

这是四个字,但每个都意味着一件事:铁。

“d”、“dj”、“đ”、“ђ”是四个字母,表示一个“电话”。

我正在使用以下 grep 公式来搜索这三个词:

grep '\s*[gг][vв]o[žжz](dj|[dđђ])a\s*' filename

这个 grep 命令根本没有输出。为什么? 它应该在文件中给出所有这些词:

gvožđa
gvozda
gvozdja
гвожђа

【问题讨论】:

  • 你忘记了-Egrep -E '\s*[gг][vв]o[žжz](dj|[dđђ])a\s*'。或者转义 |(将在 GNU grep 中工作),以及 (),因为您使用的是 POSIX BRE 模式。
  • 使用grep -E 不能解决这个问题。
  • grepping using the "|" alternative operator 没有解决我的问题。
  • 如果我运行这个egrep '\s*[gг][vв]o[žжz](dj|[dđђ])a\s*' filename,那么我会得到这个输出:gvožđa gvozda gvozdja 但没有得到这个гвожђа。它也应该给出这个:гвожђа.
  • 正确,您没有在问题中解释问题。发生这种情况是因为西里尔字母 а 不等于 ASCII a 字母。 oо 也是如此。使用grep -Eo '[gг][vв][oо][žжz](dj|[dđђ])[aа]'。其实我不明白你为什么用\s*

标签: regex grep regex-group cyrillic


【解决方案1】:

出现问题的原因是您的模式与西里尔字母 оа 不匹配,并且因为您使用没有 -E 选项的 POSIX ERE 模式。

你可以使用

grep -Eo '[gг][vв][oо][žжz](dj|[dđђ])[aа]' filename

使用\s* 实际上没有意义,因为它只匹配零个或多个空白字符(仅在 GNU grep 中)。

我在此处添加了-o 选项以输出所有匹配项,而不仅仅是匹配的行。

请参阅online grep demo

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    相关资源
    最近更新 更多