我正在尝试使用 查找所有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
答案4
你可以尝试这样的事情:
grep "^[A-Za-z]\{6\}$" myfile.txt
或者如果单词也可能包含数字,则:
grep "^[A-Za-z0-9]\{6\}$" myfile.txt
除了这些之外,只需将任何您想要的字符添加到方括号中即可。