姓名、姓氏、电话号码。这是文本:
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}$"