使用 grep 匹配固定数量字符的字符串

使用 grep 匹配固定数量字符的字符串

我正在尝试使用 查找所有6字母单词grep。我目前有这个:

grep "^.\{6\}$" myfile.txt 

但是,我发现我也得到了如下结果:étuis, étude

e我怀疑这与上面的话中的符号有关。

我可以采取什么措施来确保这种情况不会发生?

感谢您的帮助!

答案1

grep对角色的想法取决于区域设置。如果您处于非 Unicode 语言环境,并且从包含 Unicode 字符的文件中执行 grep,则字符计数将不匹配。如果您echo $LANG这样做,您将看到您所在的区域设置。

如果您将LC_CTYPE和/或LANG环境变量设置为以“.UTF-8”结尾的值,那么您将获得正确的行为:

$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$

您可以通过在命令所在的同一行上分配变量来更改单个命令的区域设置。

通过这种配置,多字节字符被视为单个字符。如果您想完全排除非 ASCII 字符,其他一些答案可以为您提供解决方案。


请注意,在存在以下情况的情况下,事情仍然有可能发生故障,或者至少不会完全按照您的预期进行组合字符。您grep可能会以不同的方式对待拉丁小写字母 E + 上述组合字符锐音和拉丁小写字母 E 与锐音。

答案2

grep使用带有 PCRE 支持的GNU ,您可以执行以下操作:

grep -Px '\X{6}'

.匹配字符时,\X匹配表意文字/字母。

在 UTF-8 语言环境中:

$ locale charmap
UTF-8
$ printf '\u00e9tuis\n\u00e9tudes\n' | grep -Px '\X{6}'
études
$ printf 'e\u0301tuis\ne\u0301tudes\n' | grep -Px '\X{6}'
études

后者études有 7 个字符、8 个字节和 6 个字素。

答案3

尝试这个:

LC_ALL=C.UTF-8 grep -x '[_[:alnum:]]\{6\}' file

-x用于匹配整行,由 POSIX 定义(参见grep)。

这里以便很好地解释它的LC_ALL作用。您可以设置LANGLC_CTYPE使用 utf-8 来获得相同的行为。生效的顺序是LC_ALL=> LANG=> LC_CTYPE

答案4

你可以尝试这样的事情:

grep "^[A-Za-z]\{6\}$" myfile.txt

或者如果单词也可能包含数字,则:

grep "^[A-Za-z0-9]\{6\}$" myfile.txt

除了这些之外,只需将任何您想要的字符添加到方括号中即可。

相关内容