我的数据在.csv文件中以这样的方式开头
"684MF7","684MF7","RN"
第一个字段“684MF7”应该只包含数字字符;第一个字段中不应出现字母字符。我有第二个字段的其他检查,在这种情况下也是“684MF7”,这是第二个字段的合法值。
我想在第一个字段中找到任何alpha,并打印该行。我调用这个sed文件
{
/^".*[^0-9]*.*",/p
}
-n
和-f
(文件名)。
什么正则表达式仅隔离第一个字段?我得到了一切,这不是我想要的。是我的问题,因为我试图匹配零个或多个而不是一个或多个字母字符?
答案 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--