Bagaimana cara saya mengambil daftar dan menghapusnya dari file?

10

Saya memiliki daftar panjang nama domain yang harus saya hapus dari / etc / remotedomains. Mereka mungkin tidak berada dalam urutan tertentu dalam file. Setiap domain berada pada satu baris.

Bagaimana saya bisa mengulangi daftar dan menemukan garis itu di domain jauh dan menghapusnya.

xenoterracide
sumber

Jawaban:

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

The -vmemberitahu grep hanya keluaran baris yang tidak cocok dengan pola.

The -f listmemberitahu grep untuk membaca pola dari file list.

The -Fmemberitahu grep untuk menafsirkan pola sebagai string biasa, bukan ekspresi reguler (sehingga Anda tidak akan mengalami kesulitan dengan regex meta-karakter).

The -xmemberitahu grep untuk mencocokkan seluruh baris, misalnya jika ada pola fooyang hanya harus menghapus garis foo, bukan garis foobaratau barfoo.

sepp2k
sumber
3
Catatan: selalu ingat untuk membuat cadangan /etc/localdomainsdan /etc/remotedomainssebelum melakukan hal-hal seperti ini.
xenoterracide
3
-Fadalah untuk pencocokan string tetap ("pencocokan tepat"), tetapi itu tidak memaksa pola untuk mencocokkan seluruh baris. POSIX menentukan -xflag untuk membatasi kecocokan pada instance di mana suatu pola cocok dengan seluruh baris.
Chris Johnsen 6-10
@ Chris: Bah, tangkapan bagus.
sepp2k
1

Gunakan komunikasi!

comm -23 /etc/remotedomains remove

Dari halaman manual:

Bandingkan file yang diurutkan FILE1 dan FILE2 baris demi baris.

Tanpa opsi, hasilkan output tiga kolom. Kolom satu berisi baris unik untuk FILE1, kolom dua berisi baris unik untuk FILE2, dan kolom tiga berisi baris yang umum untuk kedua file.

Opsi -1, -2 dan -3 menonaktifkan kolom masing-masing.

Namun itu mengharuskan file diurutkan.

jgr
sumber
0

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

Jika daftar domain yang akan Anda hapus ada dalam file, maka:

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

Catatan:

  1. Gunakan -i.bak untuk membuat cadangan domainlist.txt

  2. Jika removelist.txt memiliki banyak ribuan entri, bisa meluap panjang baris perintah maksimal. Ini bukan skenario yang sangat mungkin tetapi sesuatu yang harus Anda waspadai.

Pada refleksi lebih lanjut, risiko itu dapat dihilangkan dengan:

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