다음 줄이 포함된 파일이 있습니다.
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