linux:查找文本中仅包含 5 个字符的姓氏

linux:查找文本中仅包含 5 个字符的姓氏

姓名、姓氏、电话号码。这是文本:

Hace, Apoio, 703-2101 
Yoliot, Apostolos, 4222-1124
 Jenny,Thano,105-4122 
 Heriom,Koun, 510-4122 
 Dekon, Atolo, 502-2522 
 Feow, R,685-3431

我想查找所有只有 5 个字符的姓氏

编辑:我试过

egrep -i '[^:]+[a-z]5$' file2 

但这行不通

答案1

awk -F '[[:blank:]]*,[[:blank:]]*' 'length($2) == 5'

将字段分隔符设置为,可选地由空白和第二个字段长度为 5 的报告行包围。

grep

grep -E '^[^,]*,[[:blank:]]*[^[:blank:],][^,]{3}[^[:blank:],][[:blank:]]*(,|$)'

但请注意[^,][^[:blank:],], 匹配整理元素,根据区域设置不一定是单个字符。例如,在 GNU 系统上的捷克语言环境中,它将匹配:

Stéphane,Chazel,555-5555

因为Ch那里有一个整理元素。因此它会在这两个逗号 ( <Ch><a><z><e><l>) 之间找到 5 个整理元素。

使用 GNU grep,您可以使用该-P选项而不是-E使用 PCRE,其中括号表达式仅匹配字符。

它们不会匹配不形成有效字符的字节序列。如果文件中写入的字符的字符集与当前语言环境中的字符集不同,则可能会出现问题。例如,它不会匹配

Stéphane,ABCDE,555-5555

如果当前语言环境使用 UTF-8 作为字符集,但它é是用 iso-8859-1 字符集(0xe9 字节)编写的,因为这样é就不会匹配[^,](作为无效字节序列,它不是一个的整理除以下以外的元素,)。

另请注意,在 UTF-8 语言环境中,某些字素可以由多个字符表示。例如,é上面可以用 U+00E9 字符表示,也可以用 U+0065 字符 ( e) 后跟 U+0301(组合锐音符)表示。

要匹配字素/字形,您可以-P再次使用 and\X匹配字素簇的运算符:

grep -P '^[^,]*,\h*(?![\h,])\X((?!,)\X){3}(?![\h,])\X\h*(,|$)'

答案2

将“egrep”与 \s 和 \S 标记一起使用

egrep '^[^,]*,\s*\S{5},' file
  • 跳过第一个字段,包括第一个逗号,
  • 跳过第一个逗号后的空格,
  • 然后匹配 5 个字母,后跟可选的空格和逗号

答案3

您可以组合 3 个工具:

cut -d "," -f2 file | tr -d " " | grep -E "^.{5}$"

相关内容