0

我有一个文件,其中包含类似这样的数据

34sdf, 434ssdf, 43fef,
34sdf, 434ssdf, 43fef, sdfsfs,

我必须识别sdfsfs,并替换它和/或打印该行。

The exact condition is the tokens are comma separated. target expression starts with a non numeric character, and till a comma is met. 

现在我[^0-9]从一个非数字字符开始,但下一个字符对我来说真的是未知的,它可以是一个数字、一个特殊字符、一个字母甚至一个空格。所以我想要一个(anything)*. 但是前[]一个开始发挥作用并破坏了它。[^0-9]*or [^0-9].*,or [^0-9]\+.*,or [^0-9]{1}*,or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or or [^0-9][^,]*or [^0-9]{1}[^\,]*,)),到现在为止没有任何效果。所以我的问题是如何为此编写一个正则表达式(起始字符是非数字,然后是除逗号之外的任何字符或任何数量的字符直到逗号)我正在使用grepsed(gnu)。另一个问题是 posix 或 non-posix,有什么区别吗?

4

4 回答 4

1

可能是这样的吗?

(?:(?:^(\D.*?))|(?:,\s(\D.*?))),

这将捕获以非数字字符开头的字符串。在这里测试。

我不确定 sed 是否支持\D,但如果不支持,您可以轻松地将其替换为[^0-9]您已经知道的。

编辑:可以修剪为:

(?:\s|^)(\D.*?),
于 2013-05-22T08:35:48.387 回答
0

我认为模式(\s|^)(\D[^,]+),会抓住它。

它匹配空格或字符串开头和非数字组,后跟除逗号以外的任何内容,后跟逗号。

[^0-9]如果\D不支持,您可以使用。

于 2013-05-22T08:36:59.693 回答
0

使用 sed,并对上一个正则表达式稍作修改:

sed -n 's/.*,[ ]*\([^ 0-9][^\,]*\),/\1/p' input
于 2013-05-22T08:24:42.143 回答
0

这可能对您有用(GNU sed):

sed '/\b[^0-9,][^,]*/!d' file # only print lines that match

或者:

sed -n 's/\b[^0-9,][^,]*/XXX/gp' file # substitute `XXX` for match
于 2013-05-22T21:46:46.793 回答