배쉬- 'P'로 시작하는 모든 줄을 제거하십시오.


0

크기가 약 300KB 인 텍스트 파일이 있습니다. 이 파일에서 문자 "P"로 시작하는 모든 줄을 제거하고 싶습니다. 이것이 내가 사용한 것입니다 :

> cat file.txt | egrep -v P*

콘솔로 출력되지 않습니다. 다른 명령없이 cat을 파일에 사용할 수 있으며 잘 인쇄됩니다. 나의 마지막 의도는 :

> cat file.txt | egrep -v P* > new.txt

오류가 나타나지 않고 아무것도 인쇄하지 않으며 두 번째 명령을 실행하면 new.txt가 비어 있습니다.

편집 : Cygwin이 설치된 Windows 7을 실행 중이라고 말해야합니다.


필요가 없습니다 cat file | grep pattern... grep pattern file잘하고있다 자신의 ...
pataluc

답변:


2

대신이 명령을 시도하십시오.

cat file.txt | egrep -v '^P*' > new.txt

쓸모없는 고양이의 사용 을 피하는 대안 은 다음과 같습니다.

egrep -v '^P*' file.txt > new.txt

egrep에서 정규 표현식을 따옴표로 묶어야합니다. 그렇지 않으면 bash가 확장합니다 (이 경우 *glob는 현재 디렉토리의 모든 파일로 대문자 P로 시작합니다).


[의무적 인 "고양이를 사용하는 것은 어리석은 불만이다"불만.]
Aaron Miller

0

P*정규식은 " P0을 포함한 s의 수"를 의미합니다 . 따라서 모든 줄에 최소 0 P초가 포함되므로 항상 일치 합니다. 그것은 왜 egrep -v P*아무것도 인쇄하지 않는지를 설명합니다 : 모든 줄이 일치하고 일치 -v하지 않는 줄을 선택합니다. (실제로, 그것은 P*bash에 의해 P현재 디렉토리 의 문자 로 시작하는 파일 목록으로 확장 되므로 다른 작업을 수행 할 수 있습니다 . 따옴표를 사용해야 egrep -v "P*"하지만 문제는 아닙니다.)

P줄의 시작 부분에서 하나를 일치 시키려고합니다. 따라서 정규 표현식을 "고정"(처음에만 일치)으로 지정해야합니다 ^.

grep -v ^P file.txt > new.txt

그건 그렇고, egrep더 이상 사용되지 않습니다. 을 사용해야 grep -E하지만이 경우 기본 정규 표현식과 확장 정규 표현식 사이에는 차이가 없습니다.

grep"글로브"를 사용하지 않고 정규식을 사용합니다. 그리고 정규 표현식이 전체 라인과 일치하도록 강제하지 않습니다. 정규식과 일치하는 문자열이 줄 어딘가에 있으면 충분합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.