Jak usunąć linie z pliku, który nie zawiera kropki?

10

Mam plik zawierający dane, w tym adresy URL. Ale są różne linie, które nie są adresami URL. Jak mogę je usunąć za pomocą poleceń terminalowych Ubuntu?

Oto przykładowy plik w celach informacyjnych: Przykładowe dane

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

Chcę mieć wynik:

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

Dodatkowe niechciane linie nie mają kropki. Dlatego chcę usunąć linie bez kropek

Jaffer Wilson
źródło

Odpowiedzi:

30

W jedną stronę z sed

sed '/\./!d' file
  • /\./dopasuj dosłowną kropkę ( znak ucieczki, \ponieważ w przeciwnym razie .pasuje do dowolnego znaku)
  • !d usuń wszystko oprócz pasującego wzorca

Jeśli chcesz edytować plik na miejscu, dodaj -ido polecenia po przetestowaniu. (Możesz również dodać .bakdo -iflagi, sed -i.bak ...aby utworzyć lokalną kopię zapasową pliku.)

sed -i '/\./!d' file
Zanna
źródło
26

Możesz wstawić wszystko za pomocą kropki do nowego pliku:

grep "\."  file > newfile

W ten sposób możesz zapisać swój stary plik.

Fl.pf.
źródło
10

Lub zachowaj linie zawierające kropkę ,

sed -ni.bak '/\./p' infile
αғsнιη
źródło
8

Wydaje mi się, awkże na przyjęciu brakuje ostatniego:

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

To ustawia separator pól na kropkę. Następnie należy wydrukować te linie, które mają co najmniej dwa pola: będzie to oznaczać, że wystąpi co najmniej jedna kropka.

fedorqui
źródło
3
Prostszym rozwiązaniem awk byłoby zrobienie tego w tym samym stylu co grep: awk '/\./' file- to znaczy, aby wypisać tylko linie zawierające znak „.”.
Chris Midgley,
@ChrisMidgley good one! Ponieważ to właśnie grepsugeruje już odpowiedź , wolałem iść z pewnymi awkspecyficznymi rzeczami :)
fedorqui
6

Korzystanie z perla:

perl -i -ne 'print if /\./' /path/to/file
w płomieniach
źródło
6

Możesz to zrobić dość łatwo za pomocą vima. Jeśli nie masz ochoty używać vima jako edytora tekstu (otwieranie, edytowanie i pisanie plików), wykonaj następujące czynności:

:g!/\./d

Jeśli nie masz doświadczenia w korzystaniu z vima lub wolisz używać go jako narzędzia wiersza poleceń, możesz po prostu zrobić to z poziomu terminala:

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

Możesz to nieco zmodyfikować, aby zapisać w nowym pliku:

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

Wykorzystuje to polecenie globalne vima, które stosuje polecenie ex do każdej linii pasującej (lub niepasującej) wyrażenia regularnego. W takim przypadku polecenie to „(d) elete” i zostanie zastosowane do każdego polecenia niezgodnego z wyrażeniem regularnym\.

James
źródło