목록에서 여러 패턴과 일치하는 문자열 제거

목록에서 여러 패턴과 일치하는 문자열 제거

다음 줄이 포함된 파일이 있습니다.

1
apple
2
orange
3
banana
4
mango
5
coconut

패턴 목록이 있습니다.

1
3
5

다음을 얻기 위해 패턴 목록을 사용하여 이 줄(및 그 이후 줄)을 삭제하고 싶습니다.

2
orange
4
mango

하나의 명령으로 일일이 수동으로 입력할 수 없는 패턴이 많기 때문에 목록을 사용해야 합니다.

답변1

sed+반죽해결책:

sed -E "/\<(`paste -s -d'|' patterns`)\>/{N;d;}" file

산출:

2
orange
4
mango

  • paste -s -d'|' patterns- 정규식 교대 그룹을 얻기 위해 구분 기호 patterns로 사용되는 파일 행을 결합합니다.|(1|3|5)

  • N- 패턴 공간에 다음 줄을 추가합니다.

  • d- 패턴 공간의 행 삭제

답변2

몇 가지 옵션 저글링을 해보겠습니다 grep.

grep목록 파일의 행을 제외하고 과일 파일의 모든 행에서 이 작업을 수행 할 수 있으며 숫자는 제외됩니다.

grep -v -x -f numbers fruits

( -f주어진 패턴 파일, -x부분 일치 및 -v역 일치 방지)

불행히도 숫자와 과일은 다른 줄에 있으므로 과일은 grep에서 살아남습니다. 이를 제거하기 위해 추가 패턴을 사용해 보겠습니다 -e.

grep -v -x -e "[a-z]*" -f numbers fruits

이제 문자로만 구성된 모든 줄이 제거되므로 더 이상 과일이 없으며 원하는 과일도 없습니다. 하지만 컨텍스트에서 복구할 수 있습니다.

grep -v -x -A1 -e "[a-z]*" -f numbers fruits

( -A1매 경기 후에 추가 라인 제공) 궁극적으로 원하는 것을 제공합니다.

답변3

이 시도.

pattern_file모든 patterns콘텐츠와 나머지 콘텐츠가 포함되어 있습니다 file_content. 여기서는 grep패턴 매칭 후 행 수에 따라 변경되는 옵션을 시도했습니다 .-A 1

#!/bin/bash

while read pattern 
do
        for line_num in `grep $pattern file_content -A 1 -n | awk -F":|-" '{print $1}' | paste -sd ","`
        do
                sed -i "${line_num}d" file_content
        done
done < pattern_file

관련 정보