터미널을 통해 특정 단어가 포함 된 텍스트 파일에서 줄을 제거하는 방법은 무엇입니까?


72

텍스트 파일에서 "cat"및 "rat"라는 단어가 포함 된 모든 줄을 제거하는 방법은 무엇입니까?


이것은 숙제 과제처럼 의심스럽게 들립니다. Askubuntu의 멋진 사람들에게 답을 보내십시오.
zwets

큰 프로젝트의 일부인 저는 Linux 환경에 익숙하지 않습니다.
PersonX

답변:


100

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동작은 슬래시의 표현과 일치하는 선을 삭제한다. catrat모두 일치되고 (one|other)우리가 분명히 백 슬래시로 이스케이프 할 필요가 구문.

팁 : 파일을 덮어 쓰기 전에 연산자 sed없이 -i명령의 출력을 테스트하십시오.

( Sed 기준 -특정 문자열을 포함하는 행 삭제 )


소스 파일에서 제거하고 일치하는 파일을 생성하는 방법이 있는지 궁금합니다. 아마도 그렇지는 않지만 유용 할 것입니다 (예 : 파일이 너무 커지면 내용에 따라 분할하는 경우).
Sridhar Sarnobat

1
@ Sridhar-Sarnobat 아, 가능합니다. 티와 서브 쉘을 사용하여 stdout을 복사하십시오. 하나는 필터링하고 다른 하나는 반대로 필터링합니다. 관련이없는 유스 케이스에서 증명 티와 서브 쉘의 사용은 여기 시연 : blog.g3rt.nl/...이
gertvdijk

15

터미널에서만 테스트하려면 다음을 사용하십시오.

sed '/[cr]at/d' file_name

파일에서 해당 행을 실제로 제거하려면 다음을 사용하십시오.

sed -i '/[cr]at/d' file_name


0

당신이 파일이있는 경우 고려 file_name하면 마우스를 검색하고 싶지만 같은 시간에 마우스에서 몇 행이 같은 다른 단어를 가지고 catrat그것이 수행 할 하나의 방법, 그래서 당신은 당신의 출력 사람들을보고 싶지 않아 -

grep -r mouse file_name | grep -vE "(cat|rat)"

0

휴대용 쉘 방식

의 작품 /bin/shdash뿐만 아니라, 우분투 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.