답변:
grep 접근, 접근법, 진입, 가까이가는 길, 친근 책, 착륙 진입, 닥치다, 가까이 가다, 다가 가다, 접근시키다, 착수하다, 연구하다, 다가오다, 가깝다,들이 닥치다"cat"또는 "rat"와 일치하는 행이없는 파일의 사본을 작성하려면 grep반대로 ( -v) 전체 단어 옵션 ( -w) 과 함께 사용할 수 있습니다 .
grep -vwE "(cat|rat)" sourcefile > destinationfile
전체 단어 옵션은 일치하지 않습니다 확인합니다 cats또는 grateful예를 들어. 쉘의 출력 경로 재 지정은 >새 파일에 기록하기 위해 사용됩니다 ( ). 구문에 -E확장 정규식을 사용 하려면 옵션이 필요 (one|other)합니다.
sed 접근, 접근법, 진입, 가까이가는 길, 친근 책, 착륙 진입, 닥치다, 가까이 가다, 다가 가다, 접근시키다, 착수하다, 연구하다, 다가오다, 가깝다,들이 닥치다또는 줄을 제자리에서 제거하려면 sed -i다음을 사용할 수 있습니다 .
sed -i "/\b\(cat\|rat\)\b/d" filename
\b세트 단어 경계 및 d동작은 슬래시의 표현과 일치하는 선을 삭제한다. cat와 rat모두 일치되고 (one|other)우리가 분명히 백 슬래시로 이스케이프 할 필요가 구문.
팁 : 파일을 덮어 쓰기 전에 연산자 sed없이 -i명령의 출력을 테스트하십시오.
( Sed 기준 -특정 문자열을 포함하는 행 삭제 )
의 작품 /bin/sh인 dash뿐만 아니라, 우분투 ksh, 그리고 bash. case문장의 각 단어에 대해 여러 테스트 사례를 작성해야하지만 이식 하기가 약간 어색합니다 . 줄, 시작, 끝 또는 줄 중간에 단어가 단독으로 나타나는 경우에 작동하며 다른 단어의 일부일 수있는 부분은 무시합니다.
#!/bin/sh
line_handler(){
# $1 is line read, prints to stdout
case "$1" in
cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
rat|rat\ *|*\ rat\ *|*\ rat) true;;
*) printf "%s\n" "$1"
esac
}
readlines(){
# $1 is input file, the rest is words we want to remove
inputfile="$1"
shift
while IFS= read -r line;
do
line_handler "$line" "$@"
done < "$inputfile"
[ -n "$line" ] && line_handler "$line"
}
readlines "$@"
그리고 이것이 작동하는 방식입니다.
$ cat input.txt
the big big fat cat
the cat who likes milk
jumped over gray rat
concat
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt
concat
this is catchy
rational
irrational