답변:
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