목록을 가져 와서 파일에서 제거하려면 어떻게합니까? 특정 순서가 아닐

/ etc / remotedomains에서 제거해야 할 긴 도메인 이름 목록이 있습니다. 파일에서 특정 순서가 아닐 수도 있습니다. 각 도메인은 한 줄에 있습니다.

어떻게 목록을 반복하고 원격 도메인에서 해당 라인을 찾아 제거 할 수 있습니까?



답변

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.


답변

통신을 사용하십시오!

comm -23 /etc/remotedomains remove

매뉴얼 페이지에서 :

정렬 된 파일 FILE1과 FILE2를 한 줄씩 비교하십시오.

옵션이 없으면 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

노트:

  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