Как удалить строки, содержащие IP-адрес?

У меня есть файл вроде:

http://example.mx https://test.com http://4.3.4.4 http://dev.somedomain.com http://1.3.4.2 

Я хочу избавиться от тех, у кого есть IP-адреса, чтобы результат был следующим:

 http://example.mx https://test.com http://dev.somedomain.com 

Что я сделал:

 cat in.log | sed '/^http:\/\/[0-9]/d' > out.log 

Но это не работает.

Но это действительно работает. Правильный ответ, похоже, уже в вашем вопросе.

 $ cat in.log http://example.mx https://test.com http://4.3.4.4 http://dev.somedomain.com http://1.3.4.2 $ cat in.log | sed '/^http:\/\/[0-9]/d' > out.log $ cat out.log http://example.mx https://test.com http://dev.somedomain.com $ 

Если вы хотите удалить строки из in.log , вы можете использовать флаг -i sed :

 sed -i '/^http:\/\/[0-9]/d' in.log 

это уже работает, однако /^http:\/\/[0-9]/ будет соответствовать

 http://1.hello.word 

для соответствия «полного IP- /^http:\/\/[0-9\.]*$/ » использовать /^http:\/\/[0-9\.]*$/

где

  • [0-9\.] Сопоставить цифру и точку …
  • * … 0 или больше время ..
  • $ … до конца строки.

Похоже, вы хотите удалить строки на своем входе. В дополнение к sed , есть очень простое решение, использующее grep -v :

 grep -v 'http://\([0-9]\+\.\)\{3\}[0-9]\+' in.log 

Кроме того, здесь нет необходимости в cat и трубе: cat foo | bar cat foo | bar может быть заменен на bar < foo вообще, и в этом конкретном случае вы можете просто передать имя файла в качестве аргумента для grep или sed без необходимости в канале.

Shell purists, как правило, недовольны этим использованием cat потому что это необязательно запускает отдельный процесс (и потому, что цель cat состоит в том, чтобы скомпоновать файлы …).