リストをインポートしてファイルから削除する方法は?

リストをインポートしてファイルから削除する方法は?

/etc/remotedomains から削除するドメイン名の長いリストがあります。ファイルの特定の順序ではない可能性があります。各フィールドは1行にあります。

リストを繰り返してリモートドメインで行を見つけて削除するにはどうすればよいですか?

答え1

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

-vパターンと一致しない行のみを出力するようにgrepに指示します。

-f listgrepにファイルからパターンを読み取るように指示しますlist

パターンを正規表現ではなく通常の文字列として解釈するようにgrepに指示します-F(したがって正規表現のメタ文字に問題はありません)。

たとえば、行または行ではなく行だけを削除する必要があるパターンが-xある場合は、grepに行全体を一致させるように指示します。foofoofoobarbarfoo

答え2

ニュースレターを活用してください!

comm -23 /etc/remotedomains remove

マニュアルページから:

ソートされたファイルFILE1とFILE2を1行ずつ比較します。

オプションがない場合、3 つの出力列が生成されます。最初の列にはFILE1に固有の行が含まれ、2番目の列にはFILE2に固有の行が含まれ、3番目の列には2つのファイルに共通の行が含まれています。

オプション-1、-2、-3は対応する列を無効にします。

ただし、ファイルを並べ替える必要があります。

答え3

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

削除するドメインのリストがファイルにある場合:

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

メモ:

  1. sedにdomainlist.txtをバックアップさせるには、-i.bakを使用します。

  2. Removelist.txtがある場合たくさん何千ものエントリがあると、最大コマンドライン長を超える可能性があります。このようなことが起こる可能性はほとんどありませんが、この事実を知っておく必要があります。

もう少し考えてみると、次の方法でこのリスクを排除できます。

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

関連情報