2016-12-08 2 views
-1

У меня есть файл, который выглядит следующим образом:Использовать sed для подсчета периодов, запятых и чисел?

19.217.179.33,175.176.12.8 
253.149.205.57,174.210.221.195 
222.118.178.218,255.99.100.202 
241.55.199.243,167.98.204.104 
38.224.198.117,21.11.184.68 

Каждая строка 2 IP-адреса, разделенные запятой. Таким образом, каждая строка должна отвечать следующим требованиям:

  • Имеет 1 запр.
  • Имеет 6 периодов.
  • ТОЛЬКО цифры, запятые и периоды.

Если в строке отсутствует период, имеет больше/меньше одной запятой, имеет букву, пробел или что-то в этом роде - это неверно. В основном я просто хочу использовать sed или что-то подобное циклу через каждую строку в файле и убедиться, что каждый из них соответствует вышеуказанным требованиям.

Это что-то, что можно сделать с помощью sed? Я знаю, что вы можете использовать его для удаления файлов, которые имеют/не имеют соответствующих строк, но я не был уверен в подсчете конкретных символов или проверке того, что строка содержит только определенные символы.

Любая помощь была бы принята с благодарностью. Благодаря!

ответ

1

Что бы я сделал, это придумать правильное выражение, которое соответствует «правильным» строкам и опускает их из печати. Например:

Все, что остается, является неправильной линией.

Вот рецепт более подробно:

  • [0-9]{1,3} между один и три цифры
  • \. буквальный период (только период группового символа и соответствует любому символу)
  • (...){3} три повторения чего-то, поэтому вместе
  • ([0-9]{1,3}\.){3}[0-9]{1,3} составляет то, что выглядит как IP-адрес. (Хотя обратите внимание, что он не применяет правило < 256, поэтому соответствует 999.999.999.999.)
  • /^ ... $/ матч должен начинаться в начале строки и запускаться до конца.
  • '/ ... /d' печати все, кроме строк, которые соответствуют тому, что внутри двух косых черт
  • -r необходима, чтобы распознать синтаксис {1,3}.

Это найдет и напечатает неверные строки. Если вы хотите удалить неправильные линии, вы можете легко перевернуть это:

sed -i.bak -n -r '/^([0-9]{1,3}\.){3}[0-9]{1,3},([0-9]{1,3}\.){3}[0-9]{1,3}$/p' file 
  • -i.bak средства сохранить резервную копию, но перезаписывать входной файл
  • -n средства не выводит ничего, если явно не направленные на выход , и
  • / ... /p вывести все строки, соответствующие этому регулярному выражению.
+0

Работал отлично, спасибо! –

2

Я думаю, что grep - лучший инструмент для этого. Вы просто хотите убедиться, что каждая строка соответствует определенному регулярному выражению, поэтому инвертируйте grep с помощью -v и пометьте ввод недействительным, если какая-либо строка будет выводиться. Что-то вроде:

grep -qvE '^([0-9]{1,3}\.){3}[0-9]{1,3},([0-9]{1,3}\.){3}[0-9]{1,3}$' input || echo input is valid 

Вы можете упростить это немного:

IP='([0-9]{1,3}\.){3}[0-9]{1,3}' 
grep -qvE "^$IP,$IP$" input || echo input is valid 

Или, если вы больше заинтересованы в недействительных данных:

grep -qvE "^$IP,$IP$" input && echo input is invalid 
+0

Это тоже приятное решение. – chw21

0

Если вы хотите, чтобы отобразить информацию только о правильность содержимого файла, вы можете использовать эту команду:

sed -n -r '/^([0-9]{1,3}\.){3}[0-9]{1,3},([0-9]{1,3}\.){3}[0-9]{1,3}$/!{a \ 
FILE IS INCORRECT 
;q;};$aFILE IS OK' 

Это модифицированная версия @ chw21 ответа, но отображается только информация текст:

  • файла неправилен, или
  • FILE IS OK.