Bir listeyi nasıl alıp bir dosyadan nasıl kaldırabilirim?


10

/ Etc / remotedomains'den kaldırmam gereken etki alanı adlarının uzun bir listesi var. Muhtemelen dosyada belirli bir sırada değillerdir. Her alan bir satırdadır.

Listeyi nasıl tekrarlayabilirim ve bu satırı uzak etki alanlarında bulabilir ve kaldırabilirim.

Yanıtlar:


11
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains

-vŞablon ile eşleşmeyen sadece çıkış hatlarına grep söyler.

-f listDosyadan desenleri okumak için grep söyler list.

-F(Eğer regex meta karakterler ile derde olmayacak şekilde) düz dizeleri değil, normal ifadeler olarak desenleri yorumlamak grep söyler.

-xBir desen varsa, örneğin bütün çizgi maç için grep söyler foosadece çizgiyi kaldırmak gerekir foo, değil çizgiyi foobarveya barfoo.


3
not: her zaman yedeklemeyi unutmayın /etc/localdomainsve /etc/remotedomainsböyle şeyler yapmadan önce.
xenoterracide

3
-FSabit dize eşleme ( “tam eşleşmeler”) için, ama yok değil bütün çizgi eşleşen deseni zorlar. POSIX,-x eşleşmeleri bir desenin tüm çizgiyle eşleştiği örneklerle sınırlayacak bayrağı belirtir .
Chris Johnsen

@Chris: Bah, iyi yakaladın.
sepp2k

1

Comm kullanın!

comm -23 /etc/remotedomains remove

Man sayfasından:

Sıralanan FILE1 ve FILE2 dosyalarını satır satır karşılaştırır.

Seçenek olmadan, üç sütunlu çıktı üretin. Birinci sütun FILE1'e özgü satırlar, ikinci sütun FILE2'ye özgü satırlar içerir ve üçüncü sütun her iki dosya için ortak satırlar içerir.

-1, -2 ve -3 seçenekleri ilgili sütunları devre dışı bırakır.

Ancak dosyaların sıralanmasını gerektirir.


0

sed -r -i -e '/^(domain1|domain2|domain3|...|domainN)$/d' domainlist.txt

Silinecek alan adları listeniz bir dosyadaysa:

sed -r -i -e '/^'"$(xargs <removelist.txt|sed -e 's/ /|/g)"')$/d' domainlist.txt

Notlar:

  1. Sed domainlist.txt dosyasının yedeğini almak için -i.bak komutunu kullanın

  2. Removelist.txt varsa birçok kayıtları binlerce, maksimum komut satırı uzunluğunu taşar olabilir. Bu çok muhtemel bir senaryo değil, bilmeniz gereken bir şey.

Daha fazla düşünürken, bu risk aşağıdakilerle ortadan kaldırılabilir:

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
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.