Как удалить строки из файла, которые не содержат точку?

10

У меня есть файл, который содержит данные, включая URL-адреса. Но есть различные строки, которые не являются URL-адресами. Как я могу удалить их, используя команды терминала Ubuntu?

Вот пример файла для справки: Пример данных

com.blendtuts/S
°=
com.blengineering.www/:http
±=

Я хочу получить вывод:

com.blendtuts/S
com.blengineering.www/:http

У лишних нежелательных линий нет точек. Следовательно, я хочу удалить линии без точек

Джаффер Уилсон
источник

Ответы:

30

В одну сторону с sed

sed '/\./!d' file
  • /\./соответствует буквальной точке (экранируется с помощью, \потому что в противном случае .соответствует любому символу)
  • !d удалить все, кроме сопоставленного шаблона

Если вы хотите отредактировать файл на месте, добавьте -iв команду после тестирования. (Вы также можете добавить .bakк -iфлагу , sed -i.bak ...чтобы создать локальную резервную копию файла.)

sed -i '/\./!d' file
Занна
источник
26

Вы можете записать все с точкой в ​​новый файл:

grep "\."  file > newfile

Таким образом, вы можете сохранить свой старый файл.

Fl.pf.
источник
10

Или сохранить строки, которые содержат точку ,

sed -ni.bak '/\./p' infile
αғsнιη
источник
8

Я думаю awk, что последний пропал на вечеринку:

$ awk -F\. 'NF>1' file
com.blendtuts/S
com.blengineering.www/:http

Это устанавливает разделитель поля на точку. Затем нужно напечатать те строки, которые имеют как минимум два поля: это будет означать, что будет хотя бы одна точка.

fedorqui
источник
3
Более простым решением awk было бы сделать это в том же ключе, что и grep: awk '/\./' file- то есть вывести только строки, содержащие символ «.».
Крис Мидгли
@ChrisMidgley хороший! Так как это то, что ответ с grepуже предложенным, я предпочел пойти с некоторыми awkспецифическими вещами :)
fedorqui
6

Использование perl:

perl -i -ne 'print if /\./' /path/to/file
abligh
источник
6

Вы можете сделать это довольно легко с Vim. Если вам удобно использовать vim в качестве текстового редактора (открытие, редактирование и запись файлов), сделайте следующее:

:g!/\./d

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

vim file -c "g!/\./d" -c "wq"

Вы можете немного изменить это, чтобы сохранить в новый файл:

vim file -c "g!/\./d" -c "w newfile" -c "q!"

При этом используется «глобальная» команда vim, которая применяет команду ex к каждой строке, соответствующей (или не соответствующей) регулярному выражению. В этом случае команда "(d) elete", и она будет применяться к каждой команде, не соответствующей регулярному выражению\.

Джеймс
источник