什么是包含字母数字的第一个字段的正则表达式?

时间:2013-05-21 18:04:41

标签: sed

我的数据在.csv文件中以这样的方式开头

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

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

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

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

-n-f(文件名)。

什么正则表达式仅隔离第一个字段?我得到了一切,这不是我想要的。是我的问题,因为我试图匹配零个或多个而不是一个或多个字母字符?

3 个答案:

答案 0 :(得分: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:]],我不会抱怨。)

答案 1 :(得分:1)

通常围绕任何其他表达式的.*往往匹配超过预期。尝试使用较少的大型通配符匹配来编写更详细的表达式

我发现这个工作

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

它拾取了所有被“

”包围的群体

答案 2 :(得分:0)

也许以下内容适合您?

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

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