2010-12-01 4 views
1

, если у меня есть следующий синтаксис строкиКак проверить правильность синтаксиса линии?

FirstName, FamilyName, Address, PhoneNo 

и я читаю файл данных, которые содержат информацию, как я могу проверить, что я читаю строку с правильным синтаксисом ??

UPDATE ::

я имею в виду функцию я послать к нему каждая строка (из цикла в то время), и ее возвращение 0, если строка является правильным и 1, если строка не является?

UPDATE2 ::

правильная форма

first name(string), last name(string), address(string), phone no.(string) 

так, если линия отсутствует один или, если есть более чем 4 ,, она должна возвращать 1 ,,

Использование Bash,

Good Input является ::

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 

ТАКЖЕ ДРУГОЙ UPDATE :)

check(){ 
x=$(echo "[email protected]" | 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 *

UPDATE теперь, если я сделать правильный формат, как это ::

string, value, value, value 

значение: положительное целое число

, что эта линия должна быть заменена ::

x=$(echo "[email protected]" | grep -q '^[^,]\+,[^,]\+,[^,]\+,[^,]\+$') 

??

+1

Если вы не определяете, что такое «правильная» строка, вопрос невозможно ответить. Что-нибудь с 3 запятыми верно? вы подтверждаете цифру/длину для телефонов? – tokland 2010-12-01 15:30:54

+0

см. Мой UPDATE2 :) – 2010-12-01 15:43:07

ответ

2

Позволяет пустые поля:

check() { echo "[email protected]" | grep -q '^[^,]*,[^,]*,[^,]*,[^,]*$'; } 

не допускает поле пустым:

check() { echo "[email protected]" | grep -q '^[^,]\+,[^,]\+,[^,]\+,[^,]\+$'; } 

Bourne оболочки без использования внешних утилит (позволяет пустые поля):

check() { local IFS=,; set -- [email protected]; return $(test -n "$4" -a -z "$5"); } 

Баш 3.2 или более (позволяет пустые поля):

check() { [[ [email protected] =~ ^[^,]*,[^,]*,[^,]*,[^,]*$ ]]; } 

Bash 3.2 или выше (не допускает пустых полей):

check() { [[ [email protected] =~ ^[^,]+,[^,]+,[^,]+,[^,]+$ ]]; } 
0
is_correct() { 
    grep -q '^[^ ][^,]\+, [^ ][^,]\+, [^ ][^,]\+, [^ ][^,]\+$' <<< "[email protected]" 
} 
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 

Правильно выкидывает все, кроме образца хорошей строки, в том числе «слишком много пробелов». Единственное место, где он терпит неудачу, - это если в нем есть только один символ.

Смежные вопросы