2013-04-12 9 views
50

jestem na linii poleceń Linuksa i mam plik zdodać tekst na końcu każdej linii

127.0.0.1 
128.0.0.0 
121.121.33.111 

Chcę

127.0.0.1:80 
128.0.0.0:80 
121.121.33.111:80 

pamiętam moi koledzy używali sed za to, ale po przeczytaniu instrukcji sed nadal nie jest jasne, jak to zrobić na linii poleceń?

Odpowiedz

80

Można spróbować użyć coś takiego:.

sed 's/$/:80/' ips.txt > new-ips.txt 

** Dołączona że format pliku jest tak jak opisali w swoim pytaniu *

Mecze dowodzenia s/// podstawienie (znajdzie) koniec każdej linii w pliku (przy użyciu znaku $), a następnie dołącza (zamienia) :80 na końcu każdej linii. Plik ips.txt jest plik wejściowy ... i new-ips.txt to nowo utworzony plik (ostateczny wynik zmian.)


Ponadto, jeśli masz listę numerów IP, które zdarzy się, że numery portów dołączone już (jak zauważył Vlad i jak podane przez aragaer,) można spróbować użyć coś takiego:

sed '/:[0-9]*$/ ! s/$/:80/' ips.txt > new-ips.txt 

tak więc, na przykład, jeśli plik wejściowy wyglądał mniej więcej tak to (uwaga :80):

127.0.0.1 
128.0.0.0:80 
121.121.33.111 

Wynik końcowy będzie wyglądać mniej więcej tak:

127.0.0.1:80 
128.0.0.0:80 
121.121.33.111:80 
+0

Czy będzie dołączać ': 80' do wiersza, w którym': 80' jest już dołączony? – Vlad

+0

@Vlad Tak; ale zgodnie z podanymi przykładami programów wejściowych ... nie powinno być żadnych numerów portów na liście adresów IP. :) Nawet gdyby istniało ... OP mógł po prostu uruchomić inny sed 's ///' wcześniej, aby wyjąć numery portów na końcu każdej linii. – summea

+1

Ok, tylko wyjaśnienie ... Może powinien istnieć warunek wykluczenia linii, w których port już istnieje. – Vlad

10
sed 's/.*/&:80/' abcd.txt >abcde.txt 
8

Jeśli chcesz dodać tekst na końcu każdej linii w miejscu (w tym samym pliku), można użyć -i parametru, na przykład:

sed -i'.bak' 's/$/:80/' foo.txt 

jednak -i opcja jest n standardowego rozszerzenia systemu Unix i może nie być dostępne we wszystkich systemach operacyjnych.

Więc można rozważyć użycie ex (co jest równoważne vi -e/vim -e):

ex +"%s/$/:80/g" -cwq foo.txt 

:80 który doda do każdej linii, ale czasami może dołączyć go do pustych linii.

Więc lepiej metoda polega na sprawdzeniu, czy linia faktycznie zawierać dowolną liczbę, a następnie dołączyć go, na przykład:

ex +"g/[0-9]/s/$/:80/g" -cwq foo.txt 

Jeżeli plik ma bardziej złożoną formatu, należy rozważyć zastosowanie odpowiedniego wyrażenia regularnego, zamiast [0-9].

0

Korzystając z edytora tekstu, sprawdź, czy na końcu każdej linii znajduje się ^M (kontrola-M lub powrót karetki). Najpierw musisz je usunąć, a następnie dodać dodatkowy tekst na końcu wiersza.