/ etc/remotedomainsから削除する必要のあるドメイン名の長いリストがあります。それらはおそらくファイル内で特定の順序ではありません。各ドメインは1行にあります。
リストを繰り返し処理して、リモートドメインでその行を見つけ、削除するにはどうすればよいですか。
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains
-v
は、パターンに一致しない出力行のみをgrepに指示します。
-f list
は、ファイルlist
からパターンを読み取るようにgrepに指示します。
-F
は、パターンを正規表現ではなくプレーンな文字列として解釈するようにgrepに指示します(したがって、正規表現のメタ文字で問題が発生することはありません)。
-x
行全体に一致するようにgrepに指示します。行foo
またはfoo
ではなく、行foobar
のみを削除する必要があるパターンbarfoo
がある場合。
通信を使用してください!
comm -23 /etc/remotedomains remove
マニュアルページから:
ソートされたファイルFILE1とFILE2を1行ずつ比較します。
オプションなしで、3列の出力を生成します。列1にはFILE1に固有の行が含まれ、列2にはFILE2に固有の行が含まれ、列3には両方のファイルに共通の行が含まれます。
オプション-1、-2、および-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
ノート:
-i.bakを使用して、sedにdomainlist.txtのバックアップを作成させます
Removelist.txtにmany数千のエントリがある場合、コマンドラインの最大長がオーバーフローする可能性があります。これはあまりありそうもないシナリオですが、注意する必要があります。
さらに考えてみると、そのリスクは次の方法で排除できます。
for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done