Зрасти. Сегодня замутим простую проверку корректности формата файла. Для этого воспользуемся утилитой 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 печатает текущую строку и завершает выполнение.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Погнали чекать кейсы. Не забудь на 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
  1. Выводится номер 3-й строки.
  2. Пусто. Файл валиден.
  3. Выводится номер 9-й строки.
  4. Пусто. Файл валиден.
  5. Пусто. Файл валиден.
  6. Выводится номер 7-й строки.

Чтиво: адресация, команды, шаблоны