grep은 0.2 대신 0으로 줄을 삭제합니까?

grep은 0.2 대신 0으로 줄을 삭제합니까?

다음과 유사한 내용의 파일이 있습니다.

0
0
0.2
0
0
0
0

0이 있는 모든 행을 삭제해야 합니다.
을 사용하고 싶지만 grep -v "0"0.2가 포함된 행도 제거됩니다. 해당 옵션을 사용할 수 있다는 것을 알았지 -w만 그것도 작동하지 않는 것 같습니다.

0이 하나만 포함된 줄을 모두 삭제하고 0으로 시작하는 모든 줄을 유지하려면 어떻게 해야 합니까?

답변1

grep -vx 0

에서 man grep:

-x, --line-regexp
       Select only those matches that exactly match the whole line.
       For a regular expression pattern, this is like parenthesizing
       the pattern and then surrounding it with ^ and $.

-w0첫 번째 항목이 0.02"단어" 로 간주되므로 실패하므로 이 줄이 일치됩니다. 이는 "비단어" 문자가 뒤에 오기 때문입니다. ie 없이 원래 명령을 실행하면 -v이를 볼 수 있습니다 grep -w "0".

답변2

grep을 사용하세요:

grep -v '^0$' file

^줄의 시작을 나타내고 $줄의 끝을 나타냅니다.

답변3

하지만grep 할 수 있는이 목적을 위해(다른 답변에서 명확하게 알 수 있듯이) 한 걸음 물러나서 실제로 원하는 것이 무엇인지 생각해 보겠습니다.

  • 다음을 포함하는 파일이 있습니다.숫자
  • 다음을 기준으로 필터링을 수행하려고 합니다.수치.

정규식은 문자 시퀀스 데이터를 해석합니다. 그들은 숫자를 이해하지 못하고 개별 숫자(및 그 일반적인 조합)만 이해합니다. 특별한 경우에는 이 제한 사항을 쉽게 해결할 수 있지만 이는 결국 요구 사항이 일치하지 않는 것입니다.

여기에서 사용해야 할 타당한 이유가 없는 한 grep(예: 측정한 결과 훨씬 더 효율적이고 효율성이 중요하기 때문에) 다른 도구를 사용하는 것이 좋습니다.

awk예를 들어 다음과 같은 숫자 비교를 기반으로 필터링할 수 있습니다.

awk '$1 == 0' your_file

그리고 0보다 큰 숫자를 포함하는 모든 행을 얻으려면 다음을 수행하십시오.

awk '$1 > 0' your_file

저는 정규 표현식을 좋아합니다. 이는 훌륭한 도구입니다. 하지만 이건 아니다오직도구. 속담처럼, 당신이 가진 것이 정규 언어뿐이라면 grep모든 것이 정규 언어처럼 보입니다.

답변4

행을 삭제하고 싶을 때만 포함0 다음은 다음줄이다다음 명령을 실행하여 이러한 행을 선택할 수 있습니다.

grep -v "^0$"

0그러면 발생한 항목 만 인쇄됩니다 .줄 끝에서그리고줄의 시작 부분에동시에. 그러면 옵션 이 -v우리의 선택을 뒤집습니다.

관련 정보