【问题标题】:grep -w finds partial match in words with non-latin lettersgrep -w 在非拉丁字母的单词中找到部分匹配
【发布时间】:2021-10-26 04:44:29
【问题描述】:

我想用 grep 搜索“er”的完全匹配,但 grep -w 除了完全匹配之外,还会在带有非拉丁字母(例如“ß”)的单词中找到部分匹配。下面的命令在“großer”和“weißer”中找到“er”。预期的行为是 grep 仅在下面的字符串中找到“er”的完全匹配,而没有部分匹配。

echo "großer, Teller, der, er, weißer" | grep -w "er" 

我也尝试导出LC_ALL=C,但这并没有解决问题。

【问题讨论】:

  • echo "großer, Teller, der, er, weißer" | grep -ow "er" 为您输出了什么?
  • 要清楚,您的意思是非拉丁文(也称为非 ASCII)字母,而不是特殊字符(标点符号、数学符号等)。使用 C 语言环境是错误的;没有任何非拉丁字母。在 Unicode 语言环境中,您应该为我工作和做的事情。如果您没有意识到,grep 默认情况下会输出整行,如果该行中的任何位置存在匹配项;如果您只想输出与正则表达式匹配的行的部分(或部分),请添加-o

标签: bash grep


【解决方案1】:

如果你有 GNU grep,你可以使用

grep -oP "(*UCP)\ber\b"
grep -P "(*UCP)\ber\b"

(*UCP) PCRE 动词将使\b,字边界模式,完全支持 Unicode。

使用pcregrep,也可以使用这种方式,但需要指定-u选项:

pcregrep -ou '(*UCP)\ber\b'
pcregrep -u '(*UCP)\ber\b'

-u, --utf-8 use UTF-8 mode

o 选项用于提取匹配项,而不是打印找到匹配项的整行。

【讨论】:

  • 如何将grep -P "(*UCP)\ber\b 与从文件中获得的模式(每行一个模式)结合起来?
  • @Marc : grep -P -f <(sed 's/.*/(*UCP)\\b&\\b/' patterns.txt) foo.txt
  • @Shawn 上面的命令失败了,因为 -P 选项只支持一个模式。
  • @Marc pcregrep 似乎适用于模式列表,pcregrep -uf <(sed 's/.*/(*UCP)\\b&\\b/' patterns.txt) foo.txt
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 2013-06-04
相关资源
最近更新 更多