17

我已经尝试了几乎所有东西(我猜)但没有任何效果。(操作系统:Ubuntu 12.04)

要匹配的表达式(从文本文件中删除):

a c 4
a k 23
o s 1

我尝试了什么:

's/[[a-z][:space:][a-z][:space:][0-9]]\{1,\}//gi'
's/.\s.\s[0-9]+//g'
's/[:alpha:][:space:][:alpha:][:space:][:digit:]+'
4

3 回答 3

23

这应该匹配:

sed 's/[a-z][ ]*[a-z][ ]*[0-9]*//gi'

你的第一次尝试错过了几个方括号,你不需要最外面的一个:

sed 's/[a-z][[:space:]][a-z][[:space:]][0-9]\{1,\}//gi' input

您的第二个示例失败,因为您需要转义+,但它仍然只能在 gnu sed 中工作:

sed 's/.\s.\s[0-9]\+//g' input

最后一个也有一些类似的问题:

sed 's/[[:alpha:]][[:space:]][[:alpha:]][[:space:]][[:digit:]]\+//' input
于 2013-03-19T20:21:30.983 回答
2

中间那个很近!由于我无法理解的原因,您必须逃避加号。我还将点“ .”替换为“”,[a-z]因此它只匹配字母。

sed 's/[a-z]\s[a-z]\s[0-9]\+//g'

旧版本的奖励便携式版本sed(您好,Mac 用户!)。一些sed实现对“ +”很挑剔:

sed 's/[a-z]\s[a-z]\s[0-9][0-9]*//g'
于 2013-03-19T20:23:19.750 回答
1

[...]定义一个字符类。[a-z]匹配从a到 的任何字符z。要匹配连续字符,您必须为每个字符使用一个类:[a-z][[:space:]][a-z]

为了+具有特殊含义,您必须将其反斜杠:[0-9]\+.

命名字符类仅在字符类中起作用,即[[:alpha:]][[:space:]].

于 2013-03-19T20:23:38.827 回答