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


10

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

リストを繰り返し処理して、リモートドメインでその行を見つけて削除する方法を教えてください。

回答:


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

-vパターンに一致していないだけで、出力ラインにgrepを伝えます。

-f listファイルからパターンを読み取るためにgrepを伝えますlist

-F(あなたは正規表現のメタ文字でトラブルに実行されませんので)、プレーン文字列ではなく、正規表現としてパターンを解釈するためにはgrepに指示します。

-xパターンがあるかどう、例えば行全体を一致させるためにはgrep告げるfooだけの行削除する必要fooはなく、行foobarまたはbarfoo


3
注:このような作業を行う前に/etc/localdomains、必ずバックアップをとってください/etc/remotedomains
xenoterracide

3
-F固定文字列マッチング(「完全一致」)用ですが、パターンを強制的に行全体に一致させることはしませPOSIX-xは、パターンが行全体と一致するインスタンスに一致を制限するフラグ指定します。
Chris Johnsen、2010年

@クリス:バー、グッドキャッチ。
sepp2k 2010年

1

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

comm -23 /etc/remotedomains remove

manページから:

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

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

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

ただし、ファイルをソートする必要があります。


0

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がある場合は、多くのエントリの数千人を、それが最大のコマンドラインの長さをオーバーフローする可能性があります。これは非常にありそうなシナリオではありませんが、注意する必要があります。

さらに考察すると、そのリスクは次のようにして取り除くことができます。

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.