1

我在 .csv 文件中有这样开头的数据

"684MF7","684MF7","RN"

第一个字段“684MF7”应该只包含数字字符;第一个字段中不应出现任何字母字符。我对第二个字段进行了其他检查,在这种情况下也是“684MF7”,这是第二个字段的合法值。

我想在第一个字段中找到任何 alpha,并打印该行。我调用这个 sed 文件

{
        /^".*[^0-9]*.*",/p
}

-n-f用于文件名)。

什么正则表达式只隔离第一个字段?我在所有事情上都得到了匹配,这不是我想要的。我的问题是因为我试图匹配零个或多个而不是 1 个或多个字母字符吗?

4

3 回答 3

2

第一个字段(任何内容)将通过以下方式选择:

/^"[^"]*"/

您希望该字段中的至少一个字符是 alpha (尽管它可能被更好地视为“非数字”),在这种情况下,其中之一应该选择您所追求的:

/^"[^"]*[A-Za-z][^"]*"/
/^"[^"]*[^0-9"][^"]*"/
/^"[^"]*[[:alpha:]][^"]*"/
/^"[^"]*[^"[:digit:]][^"]*"/

请注意,否定的类也不能匹配双引号(总是测试答案的一个原因 - 下面的脚本的第一个版本列出了两行输入)。

并将其中一个转换为sed命令:

sed -n '/^"[^"]*[^"[:digit:]][^"]*"/p' <<EOF
"684MF7","684MF7","RN"
"684007","684MF7","RN"
EOF

查看问题的另一种方法是“打印第一个字段不是所有数字(至少存在一个数字)的任何行”。那是:

sed -n '/^"[[:digit:]]\{1,\}"/!p' <<EOF
"684MF7","684MF7","RN"
"684007","684MF7","RN"
EOF

总的来说,这可能是更好的使用解决方案(如果您使用[0-9]代替,我不会抱怨[[:digit:]])。

于 2013-05-21T18:41:48.793 回答
1

通常.*,围绕任何其他表达式的匹配度往往超出预期。尝试编写一个更详细且通配符匹配较少的表达式

我发现这行得通

> sed -n '/^".*[A-Z].*",".*",".*"/p' <(echo '"684MF7","684MF7","RN"')
> "684MF7","684MF7","RN"
> sed -n '/^".*[A-Z].*",".*",".*"/p' <(echo '"684117","684MF7","RN"')
>

它会拾取所有被“包围”的组

于 2013-05-21T18:12:48.193 回答
0

也许以下内容对您有用?

 echo '"A84MF7","684MF7","3N"' | sed -n '/^"[^0-9,][^",]*"/p'
 "A84MF7","684MF7","3N"

 echo '"684MF7","684MF7","7N"' | sed -n '/^"[^0-9,][^",]*"/p'
 --Nothing--
于 2013-05-21T18:27:07.637 回答