Як видалити рядки з файлу, які не містять крапки?


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

Таким чином ви можете зберегти свій старий файл.


10

Або зберігайте рядки, які містять крапку ,

sed -ni.bak '/\./p' infile

8

Я думаю awk, що останній відсутній у партії:

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

Це встановлює роздільник поля на крапку. Тоді справа в тому, щоб надрукувати ті рядки, які мають принаймні два поля: це означатиме, що виникає хоча б одна крапка.


3
Більш простим рішенням awk було б зробити це так само, як і grep: awk '/\./' file- тобто надрукувати лише рядки, що містять символ '.'.
Кріс Мідглі

@ChrisMidgley хороший! Оскільки це відповідь із grepвже запропонованою, я вважав за краще піти з деякими awkспецифічними матеріалами :)
fedorqui


6

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

:g!/\./d

Якщо вам не зручно використовувати vim, або ви хочете скористатися ним як інструментом командного рядка, ви можете просто зробити це з терміналу:

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

Ви можете трохи змінити це, щоб зберегти новий файл:

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

Для цього використовується команда "global", що застосовує команду ex до кожного рядка, що відповідає (або не відповідає) регулярному вираженню. У цьому випадку команда є "(d) elete", і вона буде застосована до кожної команди, що не відповідає регулярному вираженню\.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.