Bir dosyadaki belirli bir desen veya dizeden sonra her satırın geri kalanını nasıl silebilirim?


21

Bir metin dosyasındaki URL listem var:

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

'.Com'dan sonra gelen her şeyi silmek istiyorum.

Beklenen sonuçlar:

google.com
unix.stackexchange.com
isuckatunix.com

denedim

sed 's/.com*//' file.txt 

ama sildi .com.


.comSadece ilk /karakterden sonra ve ilk karakter dahil olmak üzere her şeyi kaldırmak yerine aramak istediğiniz belirli bir neden var mı ? en.wikipedia.org/wiki/UbuntuListenizdeki gibi bir URL'niz olsaydı ne olurdu ?
Byte Commander

Yanıtlar:


17

".Com" dan sonra gelen her şeyi açıkça silmek için ".com (herhangi bir şey)" yerine ".com" yerine mevcut sed çözümünüzü değiştirin:

sed 's/\.com.*/.com/' file.txt

İlk dönemden kaçmak için normal ifadenizi değiştirdim; aksi takdirde "thisiscommon.com/something" gibi bir şeyle eşleşirdi.

".Com" desenini, "sub.com.domain.com/foo" gibi bir şeyi yanlışlıkla kesmemek için sondaki eğik çizgi ile daha fazla tutturmak isteyebileceğinizi unutmayın:

sed 's/\.com\/.*/.com/' file.txt

9

Adlı kullanıcının awkalan ayırıcısını ( -F) aşağıdaki şekilde kullanabilirsiniz:

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

$ cat file | awk -F '\\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com

Açıklama:

NAME
       awk - pattern scanning and processing language

-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

Sonra her şeyi silmek istediğiniz gibi .com, -F '.com'satırı ayırır .comve print $1çıktıya yalnızca önceki bölümü verir .com. Böylece, beklenen çıktıyı $1".com"ekler .comve verir.




1
@Pandya: Bu dize gibi başarısızacomercial.com/asdsad
cuonglm

@cuonglm İşaret ettiğiniz için teşekkür ederiz. Geliştirilmiş cevap
Pandya

4

Etkileşimli olmayan yerinde dosya düzenleme için en iyi araçtır ex.

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

Eğer kullandıysanız vive Hiç bir kolon ile başlayan bir komut yazdığınız takdirde :size eski bir komutu kullandım. Elbette, bu şekilde gerçekleştirebileceğiniz daha gelişmiş veya "süslü" komutların çoğu Vim uzantılarıdır (ör. :bufdo) Ve POSIX spesifikasyonlarındaex tanımlanmamıştır , ancak bu spesifikasyonlar görsel olmayanlarda gerçekten şaşırtıcı derecede güç ve esneklik sağlar metin düzenleme (etkileşimli veya otomatik).

Yukarıdaki komutun birkaç bölümü vardır.

-sextoplu kullanıma hazırlanmak üzere sessiz mod sağlar . (Çıktı mesajlarını bastırın vd.)

-cdosya ( file.txtbu örnekte) bir arabellekte açıldığında yürütülecek komutu belirtir .

%eşdeğeri bir adres belirtecidir 1,$—it arabellek tüm satırlarına aşağıdaki komutun uygulandığı anlamına gelir.

szaten bildiğiniz yedek komuttur. Gelişmiş regex özelliklerinden bazıları uygulamaya göre değişse de , yaygın olarak kullanılır vive skomutuylased özdeş özelliklere sahiptir . Bu durumda ".com" dan satırın sonuna kadar sadece ".com" ile değiştirilir.

Dikey çubuk, yürütülecek sıralı komutları ayırır. Birçok (en) exuygulamada, ek bir -cseçenek de kullanabilirsiniz , örneğin:

ex -sc '%s/\(\.com\).*/\1/' -c x file.txt

Ancak bu POSIX için gerekli değildir.

xKomut çıkışları, dosyada herhangi bir değişiklik yazdıktan sonra. wq"Yaz ve çık" ifadesinin aksine x, dosyaya yalnızca arabellek düzenlenmişse yazar. Böylece dosyanız değiştirilmezse, zaman damgası korunur.



1
Yerinde düzenleme yapmaz. En azından, Gnu'nun sedsahte -i daha fazla değil . Diskteki arabellekleri okur / yazar. / W kendiniz görün ex -rve preservekomuta.
mikeserv

@mikeserv preserveKomut nedir?
Mateen Ulhaq

2

Çok hızlı, basit ve kirli python yolu:

#!/usr/bin/env python
import sys
with open( sys.argv[1]  ) as file:
    for line in file:
        print line.split("/")[0]

Örnek çalışma

skolodya@ubuntu:$ chmod +x removeStrings.py                                   

skolodya@ubuntu:$ ./removeStrings.py strings.txt                              
google.com
unix.stackexchange.com
isuckatunix.com


skolodya@ubuntu:$ cat strings.txt                                             
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

2
Downvote nedenini öğrenebilir miyim?
Sergiy Kolodyazhnyy

3
Çalışır, ancak umursamaz .com, sadece /satırdaki ilk ile başlayan her şeyi kaldırır . (bence daha iyi bir yaklaşım bile!)
Byte Komutanı

1
@ByteCommander tam olarak doğru! Etki alanı adı ise .net, diğer yaklaşımlarda etki alanı ve uzantıdan sonra gelen bölüm silinmez, bu nedenle /ayırıcı olarak kullanmak daha güvenlidir .
Sergiy Kolodyazhnyy

AskUbuntu.com'da olduğumu hissettiren cevap ve yorumlarınız için +1: D
WinEunuuchs2Unix
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.