web-dev-qa-db-ja.com

リストを取得してファイルから削除するにはどうすればよいですか?

/ etc/remotedomainsから削除する必要のあるドメイン名の長いリストがあります。それらはおそらくファイル内で特定の順序ではありません。各ドメインは1行にあります。

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

10
xenoterracide
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がある場合。

11
sepp2k

通信を使用してください!

comm -23 /etc/remotedomains remove

マニュアルページから:

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

オプションなしで、3列の出力を生成します。列1にはFILE1に固有の行が含まれ、列2にはFILE2に固有の行が含まれ、列3には両方のファイルに共通の行が含まれます。

オプション-1、-2、および-3は、それぞれの列を無効にします。

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

1
jgr

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. -i.bakを使用して、sedにdomainlist.txtのバックアップを作成させます

  2. Removelist.txtにmany数千のエントリがある場合、コマンドラインの最大長がオーバーフローする可能性があります。これはあまりありそうもないシナリオですが、注意する必要があります。

さらに考えてみると、そのリスクは次の方法で排除できます。

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