Dodaj tekst na końcu każdego wiersza

93

Jestem w linii poleceń Linuksa i mam plik z

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, że moi koledzy używali do tego seda, ale po przeczytaniu instrukcji seda nadal nie wiem, jak to zrobić w linii poleceń?

user2275580
źródło
2
Świetne pytanie i bardzo mi się podoba, jak je ujęłaś.
Anthony Rutledge

Odpowiedzi:

141

Możesz spróbować użyć czegoś takiego:

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

Pod warunkiem, że format pliku jest taki, jak opisano w pytaniu.

Polecenie s///podstawienia dopasowuje ( znajduje ) koniec każdego wiersza w pliku (przy użyciu $znaku), a następnie dodaje ( zastępuje ) znak :80na końcu każdego wiersza. ips.txtPlik jest plik wejściowy ... i new-ips.txtto nowo utworzony plik ( ostateczny wynik zmian. )


Ponadto, jeśli masz listę numerów IP, które mają już dołączone numery portów (jak zauważył Vlada i podał aragaer ), możesz spróbować użyć czegoś takiego:

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

Na przykład, jeśli twój plik wejściowy wyglądał mniej więcej tak (zwróć uwagę na :80) :

127.0.0.1
128.0.0.0:80
121.121.33.111

Ostateczny wynik wyglądałby mniej więcej tak:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80
summea
źródło
1
Ok, tylko wyjaśnienie ... Może powinien istnieć warunek wykluczający linie, w których port już istnieje.
Vlad,
3
sed '/:[0-9]*$/ ! s/$/:80/'
aragaer
3
Dodaj to do własnej odpowiedzi. Sugestia wykluczenia linii z portami jest już tutaj w komentarzach, właśnie napisałem dokładne polecenie.
aragaer
3
Jeśli plik ma terminatory CRLF, :80zostanie dodany na początku następnego wiersza. W dos2unixrazie potrzeby użyj najpierw na pliku.
djnz0feh
1
czy to -nkonieczne? prawdopodobnie nie dla większości użytkowników.
jimh
16

Zwięzła wersja polecenia sed :

sed -i s/$/:80/ file.txt

Wyjaśnienie:

  • sed s TREAM wyd itor
    • -i i n-place (edytuj plik w miejscu)
    • s s polecenia ubstitution
    • /replacement_from_reg_exp/replacement_to_text/ komunikat
    • $dopasowuje koniec wiersza ( replace_from_reg_exp )
    • :80tekst, który chcesz dodać na końcu każdej linii ( zamiana_na_tekst )
  • file.txt nazwa pliku
simhumileco
źródło
12
sed 's/.*/&:80/'  abcd.txt >abcde.txt
sudhir
źródło
12

Jeśli chcesz dodać tekst na końcu każdego wiersza w miejscu (w tym samym pliku), możesz użyć -iparametru, na przykład:

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

Jednak -iopcja jest niestandardowym rozszerzeniem Uniksa i może nie być dostępna we wszystkich systemach operacyjnych.

Możesz więc rozważyć użycie ex(co jest równoważne z vi -e/ vim -e):

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

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

Lepszą metodą jest więc sprawdzenie, czy wiersz faktycznie zawiera jakąkolwiek liczbę, a następnie dopisanie go, na przykład:

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

Jeśli plik ma bardziej złożony format, rozważ użycie odpowiedniego wyrażenia regularnego zamiast [0-9].

kenorb
źródło
1

Używając edytora tekstu, sprawdź ^M(control-M lub powrót karetki) na końcu każdego wiersza. Najpierw musisz je usunąć, a następnie dołączyć dodatkowy tekst na końcu linii.

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt
Jan
źródło
0
  1. Możesz to również osiągnąć za pomocą techniki odniesienia wstecznego

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. Możesz także używać z awk w ten sposób

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt
    
k_vishwanath
źródło
-1

sed -i 's / $ /, / g' foo.txt

Robię to dość często, aby dodać przecinek na końcu wyniku, więc mogę po prostu skopiować i wkleić go do tablicy Pythona (lub twojej ulubionej)

bogaty
źródło