Зрасти. Сегодня замутим простую проверку корректности формата файла. Для этого воспользуемся утилитой sed.
Вводные
Есть файл с последовательностью символов 1, 2, 3, 4, 5. Каждая цифра с новой строки. Эти символы могут располагаться в любой позиции строки. Строка может содержать другие символы, отличные от символов заданной последовательности.
Пример такого файла:
1
2
3
4
a1
b2
3c
4d
Теперь нужно, чтобы при проверке такого файла программа прерывалась и выводила номер строки, которая нарушает формат. Если файл содержит допустимую последовательность или пустой, то молчим.
Создаём скрипт check
#!/usr/bin/sed -nf
$bE ; /1/!bE ; n
$bE ; /2/!bE ; n
$bE ; /3/!bE ; n
/4/b
:E = ; q
Необычно? Необычно! Это скрипт на языке Sed. Давай разберём, что тут происходит.
$bE = если находимся на последней строке, переход к метке E.
/1/!bE ; n = если текущая строка не содержит 1, переход к метке E. В противном случае переходим к следующей строке.
…аналогично для 2 и 3.
/4/b = если текущая строка содержит 4, перейти в конец скрипта.
:E = ; q = метка E печатает текущую строку и завершает выполнение.
check впиздярить +x.printf '%s\n' {1..3} | ./check
printf '%s\n' {1..4} | ./check
printf '%s\n' {1..4} {1..5} | ./check
printf '%s\n' {1..4} {1..4} | ./check
printf '%s\n' a{1..4} b{1..4} | ./check
printf '%s\n' a{1..4} b{1..3} | ./check
- Выводится номер 3-й строки.
- Пусто. Файл валиден.
- Выводится номер 9-й строки.
- Пусто. Файл валиден.
- Пусто. Файл валиден.
- Выводится номер 7-й строки.








Комментарии