如果我有以下行语法
FirstName, FamilyName, Address, PhoneNo
我正在读取包含信息的数据文件,如何检查我是否使用正确的语法读取了一行?
UPDATE ::
我的意思是我发送给它的每一行(来自while循环)的函数,如果该行正确则返回0,如果该行不是则返回1?
UPDATE2 ::
正确的表格是
first name(string), last name(string), address(string), phone no.(string)
所以,如果该行缺少一行或者如果超过4行,则应返回1,
使用Bash,
良好的输入是::
Rami, Jarrar, Jenin - Wadi berqen, 111 111
#处理的一些案例
, Jarrar, Jenin - Wadi berqen, 111 111
- Extra Spaces::
Rami, Jarrar, Jenin - Wadi berqen, 111 111
Rami, Jarrar, Jenin - Wadi berqen, 111 111, 213 3123
还有另一个更新:)
check(){
x=$(echo "$@" | grep -q '^[^,]\+,[^,]\+,[^,]\+,[^,]\+$')
return $x
}
len=#number of lines in the file
i=1
while [ $i -le $len ]; do
line=$(cat $file)
#------this is where i call the func-----
check $line
if [ $? -eq 1 ];then
echo "ERROR"
else
echo "Good Line"
fi
BASH 2.3.39 * GREP 2.5.3 *
更新 现在,如果我制作正确的格式,如::
string, value, value, value
值:是正整数
该行应该替换::
x=$(echo "$@" | grep -q '^[^,]\+,[^,]\+,[^,]\+,[^,]\+$')
...
答案 0 :(得分:2)
允许空字段:
check () { echo "$@" | grep -q '^[^,]*,[^,]*,[^,]*,[^,]*$'; }
不允许任何字段为空:
check () { echo "$@" | grep -q '^[^,]\+,[^,]\+,[^,]\+,[^,]\+$'; }
不使用外部实用程序的Bourne shell(允许空字段):
check () { local IFS=,; set -- $@; return $(test -n "$4" -a -z "$5"); }
Bash 3.2或更高版本(允许空字段):
check () { [[ $@ =~ ^[^,]*,[^,]*,[^,]*,[^,]*$ ]]; }
Bash 3.2或更高版本(不允许空字段):
check () { [[ $@ =~ ^[^,]+,[^,]+,[^,]+,[^,]+$ ]]; }
答案 1 :(得分:0)
is_correct () {
grep -q '^[^ ][^,]\+, [^ ][^,]\+, [^ ][^,]\+, [^ ][^,]\+$' <<< "$@"
}
l=0
while read line ; do
is_correct "$line" && echo line $l ok || echo Invalid syntax on line $l
((l+=1))
done <<<"Rami, Jarrar, Jenin - Wadi berqen, 111 111
, Jarrar, Jenin - Wadi berqen, 111 111
- Extra Spaces::
Rami, Jarrar, Jenin - Wadi berqen, 111 111
Rami, Jarrar, Jenin - Wadi berqen, 111 111, 213 3123
A line, containg fields with, many spaces, but otherwise valid
a, b, c, d
aa, bb, cc, dd"
收率:
line 0 ok
Invalid syntax on line 1
Invalid syntax on line 2
Invalid syntax on line 3
Invalid syntax on line 4
line 5 ok
Invalid syntax on line 6
line 7 ok
正确地抛出除样本好的线以外的所有线,包括“太多空格”的情况。它失败的唯一地方是字段中只有一个字符。