Her satırın sonuna metin ekleyin


93

Linux komut satırındayım ve dosyam var

127.0.0.1
128.0.0.0
121.121.33.111

İstiyorum

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

Meslektaşlarımın bunun için sed kullandığını hatırlıyorum, ancak sed kılavuzunu okuduktan sonra hala komut satırında nasıl yapılacağını bilmiyor musunuz?


2
Harika bir soru ve onu çerçeveleme şeklini seviyorum.
Anthony Rutledge

Yanıtlar:


142

Şunun gibi bir şey kullanmayı deneyebilirsiniz:

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

Dosya formatınızın, sorunuzda tanımladığınız gibi olması şartıyla.

Değiştirme s///komutu dosyanızdaki her satırın sonuyla eşleşir ( bulur ) ( $karakteri kullanarak ) ve ardından her satırın sonuna ekler ( değiştirir ) :80. ips.txtDosyanın giriş dosyası olduğunu ... ve new-ips.txtyeni oluşturulan dosyasıdır ( Değişiklerinizin nihai sonucu. )


Ayrıca, bağlantı noktası numaralarının zaten eklenmiş olduğu bir IP numaralar listeniz varsa ( Vlad tarafından belirtildiği ve aragaer tarafından verildiği gibi) aşağıdaki gibi bir şey kullanmayı deneyebilirsiniz:

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

Yani, örneğin, girdi dosyanız şuna:80 benzer bir şeye benziyorsa (not edin ) :

127.0.0.1
128.0.0.0:80
121.121.33.111

Nihai sonuç şuna benzer:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

1
Tamam, sadece açıklığa kavuşturuyorum ... Belki bir portun zaten mevcut olduğu hatları dışlamak için bir koşul olmalıdır.
Vlad

3
sed '/:[0-9]*$/ ! s/$/:80/'
aragaer

3
Kendi cevabınıza ekleyin. Bağlantı noktaları olan satırları hariç tutma önerisi zaten burada yorumlarda, sadece tam komutu yazdım.
aragaer

3
Dosyanın CRLF sonlandırıcıları varsa, :80aşağıdaki satırın başına eklenir. Gerekirse dos2unixönce dosyada kullanın .
djnz0feh

1
olan -ngerekli? muhtemelen çoğu kullanıcı için değil.
jimh

17

Sed komutunun kısa versiyonu :

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

Açıklama:

  • sed s Team, ed in-
    • -i i n-place (dosyayı yerinde düzenle)
    • s s ubstitution komutu
    • /replacement_from_reg_exp/replacement_to_text/ Beyan
    • $satırın sonuyla eşleşir ( replace_from_reg_exp )
    • :80her satırın sonuna eklemek istediğiniz metin ( replace_to_text )
  • file.txt dosya adı


12

Yerinde her satırın sonuna metin eklemek isterseniz (aynı dosyaya), -iparametre kullanabilirsiniz , örneğin:

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

Bununla birlikte, -iseçenek standart olmayan Unix uzantısıdır ve tüm işletim sistemlerinde bulunmayabilir.

Yani ex( vi -e/ ile eşdeğer olan vim -e) kullanmayı düşünebilirsiniz :

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

bu :80her satıra eklenecektir, ancak bazen boş satırlara da ekleyebilir.

Bu yüzden daha iyi bir yöntem, satırın gerçekten herhangi bir sayı içerip içermediğini kontrol etmek ve sonra onu eklemek, örneğin:

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

Dosya daha karmaşık bir biçime sahipse, bunun yerine uygun normal ifadeyi kullanmayı düşünün [0-9].


1

Bir metin düzenleyici kullanarak ^M, her satırın sonunda (control-M veya satır başı) öğesini kontrol edin . Önce bunları kaldırmanız, ardından ek metni satırın sonuna eklemeniz gerekir.

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt

0
  1. Bunu geri referans tekniğini kullanarak da başarabilirsiniz.

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. Bunun gibi awk ile de kullanabilirsiniz

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

-1

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

Bunu bir çıktının sonuna virgül eklemek için sık sık yapıyorum, böylece onu bir Python (veya en sevdiğiniz dil) dizisine kolayca kopyalayıp yapıştırabilirim

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.