Проверьте в файле данные, соответствующие синтаксису - PullRequest
0 голосов
/ 28 мая 2020

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

Синтаксис: ИМЯ / ФАМИЛИЯ / СТРАНА

Примечание: каждая запись в файле должна соответствовать синтаксису. если одна запись не совпадает, то должна отображаться ошибка или успех

Данные файла

Ajay/abc/india
Avik/bcs/delhi
Viraj/xyz/

Как вы можете видеть, данные файла последние запись не соответствует синтаксису, тогда должна отображаться ошибка

Мой код

 for i in `cat /demo/Student.txt`
      do 
      check=`echo $i | cut -d '/' -f3`
      if [[ -z $check ]];
      then 
        echo failed syntax does not match NAME/SURNAME/COUNTRY
        exit 1 
      fi 
    done

Ответы [ 3 ]

0 голосов
/ 29 мая 2020

Может быть, использовать awk

#check value in third column, using / as a delimiter
check="$(awk -F"/" '{print $3}' /demo/Student.txt)"

#check if third column is empty
if [ "$check" == "" ]; then
    echo "failed syntax..."
    exit 1
fi

Вы можете запустить эту проверку для трех столбцов (измените print $ 3 на $ 1 и $ 2). Вероятно, не самое эффективное решение, так как я также довольно новичок в сценариях оболочки, но думаю должно работать.

0 голосов
/ 29 мая 2020

Синтаксис: ИМЯ / ФАМИЛИЯ / СТРАНА

Сильно недооценен. Сначала напишите регулярное выражение, соответствующее вашей строке, а затем просто используйте утилиту, чтобы проверить, соответствует ли каждая строка регулярному выражению.

With grep:

if grep -v -q '^[[:alpha:]]\+/[[:alpha:]]\+/[[:alpha:]]\+$' "$file"; then
    echo "failed synax grep"
fi

grep соответствует регулярному выражению:

  • -v инвертировать совпадение
  • ^ совпадение начала строки
  • [[:alpha:]]\+ один или несколько последовательных символов классы символов sed . Вместо этого вы можете использовать [^/]* или [^/]+ для того же поведения, что и ваш текущий код.
  • / a sla sh
  • et c.
  • $ соответствие окончанию строки

С gnu sed:

if ! sed -n '\@^[[:alpha:]]\+/[[:alpha:]]\+/[[:alpha:]]\+$@!q1' "$file"; then
    echo "failed syntax"
fi

Sed делает:

  • \@....@ - сопоставить регулярное выражение внутри
  • ! - если регулярное выражение было не сопоставлено
  • q1 - выйти со статусом выхода 1

Вы также можете удалить все символы, кроме новой строки и sla sh, и проверить, есть ли в каждой строке 3 символа.

Примечания:

0 голосов
/ 28 мая 2020

cut -d '/'-f3

Это недопустимый синтаксис, как cut свободно сообщает мне. Вы не получили никаких сообщений консоли, указывающих на проблему?

cut: the delimiter must be a single character Try 'cut --help' for more information.

Исправьте это, поставив пробел перед переключателем -f.

Затем сценарий работает для меня: он сообщает об ошибке с вашим файлом как есть, а затем не будет ошибок, если я добавлю «страну» (hi) в последнюю строку.


Демо:

ввод:

Ajay/abc/india
Avik/bcs/delhi
Viraj/xyz/

вывод:

$ sh -x test.sh
++ cat test.txt
+ for i in `cat test.txt`
++ echo Ajay/abc/india
++ cut -d / -f3
+ check=india
+ [[ -z india ]]
+ for i in `cat test.txt`
++ echo Avik/bcs/delhi
++ cut -d / -f3
+ check=delhi
+ [[ -z delhi ]]
+ for i in `cat test.txt`
++ echo Viraj/xyz/
++ cut -d / -f3
+ check=
+ [[ -z '' ]]
+ echo failed syntax does not match NAME/SURNAME/COUNTRY
failed syntax does not match NAME/SURNAME/COUNTRY
+ exit 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...