Załóżmy, że mam listę adresów URL w pliku tekstowym:
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
Chcę usunąć wszystko, co następuje po „.com”.
Oczekiwane rezultaty:
google.com
unix.stackexchange.com
isuckatunix.com
próbowałem
sed 's/.com*//' file.txt
ale to też zostało usunięte .com
.
text-processing
sed
Koshur
źródło
źródło
.com
tylko zamiast usuwać wszystko po pierwszej/
postaci i włącznie z nią ? Co jeśli masz adres URL taki jaken.wikipedia.org/wiki/Ubuntu
na liście?Odpowiedzi:
Aby jawnie usunąć wszystko, co następuje po „.com”, po prostu zmodyfikuj istniejące rozwiązanie sed, aby zamienić „.com (cokolwiek)” na „.com”:
Poprawiłem twoje wyrażenie regularne, aby uciec od pierwszego okresu; inaczej pasowałoby do czegoś w stylu „thisiscommon.com/something”.
Pamiętaj, że możesz dodatkowo zakotwiczyć wzór „.com” za pomocą ukośnika, aby nie przypadkowo przyciąć coś takiego jak „sub.com.domain.com/foo”:
źródło
Możesz użyć
awk
separatora pól (-F
) w następujący sposób:Wyjaśnienie:
Jak chcesz usunąć wszystkie rzeczy po
.com
,-F '.com'
oddziela linię od.com
iprint $1
daje wynik tylko część wcześniejszą.com
. Tak,$1".com"
dodaje.com
i daje oczekiwany wynik.źródło
/
jako FS i wziąć pierwsze pole?acomercial.com/asdsad
Najlepszym narzędziem do nieinteraktywnej edycji plików w miejscu jest
ex
.Jeśli używałeś
vi
i kiedykolwiek wpisałeś polecenie zaczynające się od dwukropka:
, użyłeś polecenia ex. Oczywiście wiele bardziej zaawansowanych lub „fantazyjnych” poleceń, które można wykonać w ten sposób, są rozszerzeniami Vima (np.:bufdo
) I nie są zdefiniowane w specyfikacjach POSIXex
, ale specyfikacje te pozwalają na naprawdę zadziwiający stopień mocy i elastyczności w trybie niewizualnym edycja tekstu (interaktywna lub automatyczna).Powyższe polecenie składa się z kilku części.
-s
włącza tryb cichy, aby przygotować sięex
do użycia wsadowego. (Pomiń komunikaty wyjściowe i in.)-c
określa polecenie do wykonania pofile.txt
otwarciu pliku ( w tym przypadku) w buforze.%
jest specyfikatorem adresu równoważnym1,$
— oznacza to, że następujące polecenie jest stosowane do wszystkich linii bufora.s
to polecenie zastępcze, które prawdopodobnie już znasz. Jest powszechnie używanyvi
i ma zasadniczo identyczne funkcje jaks
poleceniesed
, chociaż niektóre zaawansowane funkcje wyrażenia regularnego mogą się różnić w zależności od implementacji. W tym przypadku z „.com” do końca wiersza zastępuje się tylko „.com”.Pionowy pasek oddziela sekwencyjne polecenia do wykonania. W wielu (większości)
ex
implementacjach możesz również użyć dodatkowej-c
opcji, na przykład:Nie jest to jednak wymagane przez POSIX.
Do
x
wyjścia polecenia, po zapisaniu zmian w pliku. W przeciwieństwie do tego,wq
co oznacza „zapisz i wyjdź”,x
zapisuje do pliku tylko wtedy, gdy bufor został edytowany. Dlatego jeśli plik nie zostanie zmieniony, znacznik czasu zostanie zachowany.źródło
sed
fałszywy -i Gnu . Odczytuje / zapisuje w buforach na dysku. Sprawdź sam w /ex -r
ipreserve
polecenie.preserve
polecenie?Bardzo szybki, prosty i brudny sposób na python:
Przykładowy przebieg
źródło
.com
, po prostu usuwa wszystko, zaczynając od pierwszego/
w linii. (co jest moim zdaniem nawet lepszym podejściem!).net
, w innych podejściach część, która pojawia się po domenie i rozszerzeniu, nie zostanie usunięta, więc bezpieczniej jest użyć jej/
jako separatora.