Tambahkan teks di akhir setiap baris

93

Saya menggunakan baris perintah Linux dan saya memiliki file dengan

127.0.0.1
128.0.0.0
121.121.33.111

saya ingin

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

Saya ingat rekan-rekan saya menggunakan sed untuk itu, tetapi setelah membaca manual sed masih belum jelas bagaimana melakukannya pada baris perintah?

pengguna2275580
sumber
2
Pertanyaan bagus dan saya suka bagaimana Anda membingkainya.
Anthony Rutledge

Jawaban:

141

Anda dapat mencoba menggunakan sesuatu seperti:

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

Asalkan format file Anda sama seperti yang Anda jelaskan dalam pertanyaan Anda.

The s///perintah substitusi pertandingan ( temuan ) akhir setiap baris dalam file Anda (menggunakan $karakter) dan kemudian menambahkan ( Menggantikan ) yang :80ke akhir setiap baris. The ips.txtfile file input Anda ... dan new-ips.txtadalah file Anda yang baru dibuat ( hasil akhir dari perubahan. )


Juga, jika Anda memiliki daftar nomor IP yang kebetulan memiliki nomor port yang terpasang, (seperti yang dicatat oleh Vlad dan seperti yang diberikan oleh aragaer ,) Anda dapat mencoba menggunakan sesuatu seperti:

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

Jadi, misalnya, jika file input Anda terlihat seperti ini (perhatikan :80) :

127.0.0.1
128.0.0.0:80
121.121.33.111

Hasil akhirnya akan terlihat seperti ini:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80
summea
sumber
1
Ok, klarifikasi saja ... Mungkin harus ada syarat untuk mengecualikan baris di mana port sudah ada.
Vlad
3
sed '/:[0-9]*$/ ! s/$/:80/'
aragaer
3
Tambahkan ke jawaban Anda sendiri. Saran untuk mengecualikan baris dengan port sudah ada di sini di komentar, saya baru saja menulis perintah yang tepat.
aragaer
3
Jika file memiliki terminator CRLF, maka :80akan ditambahkan ke awal baris berikut. Gunakan dos2unixpada file tersebut terlebih dahulu jika perlu.
djnz0feh
1
apakah -nperlu? mungkin tidak untuk sebagian besar pengguna.
jimh
16

Versi ringkas dari perintah sed :

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

Penjelasan:

  • sed s tream ed itor
    • -i i n-place (edit file di tempat)
    • s s perintah ubstitution
    • /replacement_from_reg_exp/replacement_to_text/ pernyataan
    • $cocok dengan akhir baris ( replacement_from_reg_exp )
    • :80teks yang ingin Anda tambahkan di akhir setiap baris ( replacement_to_text )
  • file.txt nama file
simhumileco.dll
sumber
12
sed 's/.*/&:80/'  abcd.txt >abcde.txt
sudhir
sumber
12

Jika Anda ingin menambahkan teks di akhir setiap baris di tempat (dalam file yang sama), Anda dapat menggunakan -iparameter, misalnya:

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

Namun -ipilihannya adalah ekstensi Unix non-standar dan mungkin tidak tersedia di semua sistem operasi.

Jadi, Anda dapat mempertimbangkan untuk menggunakan ex(yang setara dengan vi -e/ vim -e):

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

yang akan ditambahkan :80ke setiap baris, tetapi terkadang dapat menambahkannya ke baris kosong.

Jadi metode yang lebih baik adalah memeriksa apakah baris tersebut benar-benar berisi nomor apa pun, dan kemudian menambahkannya, misalnya:

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

Jika file memiliki format yang lebih kompleks, pertimbangkan untuk menggunakan regex yang tepat, daripada [0-9].

kenorb
sumber
1

Menggunakan editor teks, periksa ^M(control-M, atau carriage return) di akhir setiap baris. Anda harus menghapusnya terlebih dahulu, lalu menambahkan teks tambahan di akhir baris.

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt
John
sumber
0
  1. Anda juga dapat melakukannya dengan menggunakan teknik referensi latar

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. Anda juga bisa menggunakan dengan awk seperti ini

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt
    
k_vishwanath
sumber
-1

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

Saya melakukan ini cukup sering untuk menambahkan koma di akhir output sehingga saya dapat dengan mudah menyalin dan menempelkannya ke array Python (atau fav lang Anda)

kaya
sumber