Terminalden belirli sözcükleri içeren metin dosyasından satırlar nasıl çıkarılır?


72

Tüm satırları "cat" ve "rat" kelimelerini içeren metin dosyasından nasıl çıkarabilirim?


Bu şüpheli bir ev ödevi ödevi gibi geliyor. Lütfen cevabınızı Askubuntu'daki güzel insanlara atfetmeyi unutmayın.
zwets

Bu büyük projenin bir parçası, ben Linux ortamında yeniyim.
PersonX

Yanıtlar:


100

grep yaklaşmak, yanaşmak, yaklaşım

Dosyanın "cat" veya "rat" ile eşleşen çizgileri olmayan bir kopyasını oluşturmak için grep, reverse ( -v) biçiminde ve bütün sözcük seçeneği ( -w) ile kullanabilirsiniz.

grep -vwE "(cat|rat)" sourcefile > destinationfile

Tam kelime seçeneği Eşleşmeyecek emin olur catsya gratefulmesela. Kabuğunuzun çıktı yönlendirmesi ( >) yeni bir dosyaya yazmak için kullanılır . Sözdizimi -Eiçin genişletilmiş normal ifadeleri etkinleştirme seçeneğine ihtiyacımız var (one|other).

sed yaklaşmak, yanaşmak, yaklaşım

Alternatif olarak, hatları yerinde kaldırmak için kullanabilirsiniz sed -i:

sed -i "/\b\(cat\|rat\)\b/d" filename

\bSetleri kelime sınırları ve doperasyon öne eğik çizgiler arasında ifade ile eşleşen çizgiyi siler. catve rather ikisi de (one|other)görünüşte ters eğik çizgi ile kaçmamız gereken sözdizimiyle eşleştiriliyor .

İpucu: Dosyanın üzerine yazmadan önce komutun çıktısını test etmek sediçin -ioperatör olmadan kullanın .

( Sed'e göre - Belirli bir dize içeren bir satırı sil )


Hem kaynak dosyadan kaldırma işlemini hem de eşleşmeleri olan dosyayı oluşturmanın bir yolu olup olmadığını merak ediyorum. Muhtemelen hayır, ama faydalı olur (örneğin, çok büyük bir dosya aldığınızda içeriğe göre bölüyorsunuz).
Sridhar Sarnobat 14:16

1
@ Sridhar-Sarnobat Ah, yapabilirsiniz. Stdout'u kopyalamak için tee ve subshells kullanın. Birinde filtre, diğerinde ise tersi. Burada gösterilen ilgisiz bir veritabanında
gertvdijk

15

Sadece terminalde test etmek için şunları kullanın:

sed '/[cr]at/d' file_name

Bu satırları dosyadan gerçekten kaldırmak için, şunu kullanın:

sed -i '/[cr]at/d' file_name


0

Dosyanız varsa file_nameve fareyi aramak istiyorsanız, ancak aynı zamanda fareden birkaç satır gibi başka sözcükleri de içeren catve ratçıktınızdakileri görmek istemiyorsanız, bunu yapmanın tek yolu -

grep -r mouse file_name | grep -vE "(cat|rat)"

0

taşınabilir kabuk yolu

Çalışıyor /bin/sholan dashyanısıra, Ubuntu'da kshve bash. Tuhaf caseama ifadede her kelime için birden fazla test senaryosu yazmanız biraz garip . Kelimenin satırda, başında, satırın sonunda veya satırın ortasında tek başına göründüğü durumlarla çalışır ve başka bir kelimenin neresinde olabileceğini yoksayar.

#!/bin/sh
line_handler(){
   # $1 is line read, prints to stdout
    case "$1" in
        cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
        rat|rat\ *|*\ rat\ *|*\ rat) true;; 
        *) printf "%s\n" "$1"
    esac
}

readlines(){
    # $1 is input file, the rest is words we want to remove
    inputfile="$1"
    shift

    while IFS= read -r line;
    do
        line_handler "$line" "$@"
    done < "$inputfile"
    [ -n "$line" ] && line_handler "$line" 
}

readlines "$@"

Ve bu nasıl çalışır:

$ cat input.txt                                                                                                                                                        
the big big fat cat
the cat who likes milk 
jumped over gray rat
concat 
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt                                                                                                                                              
concat 
this is catchy
rational
irrational
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.