/etc/remotedomains から削除するドメイン名の長いリストがあります。ファイルの特定の順序ではない可能性があります。各フィールドは1行にあります。
リストを繰り返してリモートドメインで行を見つけて削除するにはどうすればよいですか?
答え1
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains
-v
パターンと一致しない行のみを出力するようにgrepに指示します。
-f list
grepにファイルからパターンを読み取るように指示しますlist
。
パターンを正規表現ではなく通常の文字列として解釈するようにgrepに指示します-F
(したがって正規表現のメタ文字に問題はありません)。
たとえば、行または行ではなく行だけを削除する必要があるパターンが-x
ある場合は、grepに行全体を一致させるように指示します。foo
foo
foobar
barfoo
答え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
メモ:
sedにdomainlist.txtをバックアップさせるには、-i.bakを使用します。
Removelist.txtがある場合たくさん何千ものエントリがあると、最大コマンドライン長を超える可能性があります。このようなことが起こる可能性はほとんどありませんが、この事実を知っておく必要があります。
もう少し考えてみると、次の方法でこのリスクを排除できます。
for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done