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

10

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

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

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

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

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

В дополнительных нежелательных линиях нет точки. Следовательно, я хочу удалить строки без точек

    
задан Jaffer Wilson 08.11.2016 в 10:41
источник

6 ответов

30

Один из способов с sed

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

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

sed -i '/\./!d' file
    
ответ дан Zanna 08.11.2016 в 10:45
источник
26

Вы можете grep все с точкой в ​​новый файл:

grep "\."  file > newfile

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

    
ответ дан Fl.pf. 08.11.2016 в 11:07
10

Или сохраните строки, содержащие dot ,

sed -ni.bak '/\./p' infile
    
ответ дан αғsнιη 08.11.2016 в 10:50
8

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

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

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

    
ответ дан fedorqui 08.11.2016 в 11:58
6

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

perl -i -ne 'print if /\./' /path/to/file
    
ответ дан abligh 08.11.2016 в 11:22
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», и она будет применяться к каждой команде, не соответствующей регулярному выражению \.

    
ответ дан DJMcMayhem 08.11.2016 в 21:49