Bash의 정규식 문제: [^negate]가 작동하지 않는 것 같습니다.

Bash의 정규식 문제: [^negate]가 작동하지 않는 것 같습니다.

Bash에서 실행 하면 마치 명령이 무시된 ls /directory | grep '[^term]'것처럼 일반 목록이 표시됩니다 . grep나는 똑같은 것을 시도했고 egrep큰 따옴표와 작은 따옴표를 사용하여 사용해 보았지만 더 나은 결과는 없었습니다. 시도하면 ls /directory | grep '^[term]예상대로 term으로 시작하는 모든 항목을 얻습니다.

온라인 편집기에서 이 명령을 시도했는데 다음과 같이 할 수 있습니다.내 정규식 테스트제대로 작동했습니다. 하지만 Bash에서는 그렇지 않습니다. 따라서 시뮬레이션에서는 작동하지만 실제 생활에서는 작동하지 않습니다.

저는 Crunchbang Linux 10을 사용하고 있습니다. 이것이 충분한 정보였기를 바라며 모든 팁을 기대합니다. 이렇게 기본적인 수준에서 수행하지 못하고 시간을 낭비하는 것은 정말 답답하기 때문입니다!

답변1

당신이 원하는 일이 실제로 일어나고 있나요? 실행하면 ls /directory | grep '[^term]'본질적으로 문자 용어 m을 찾고 있습니다. 이는 파일 이름에 다른 문자가 포함되어 있어도 에 계속 표시된다는 의미입니다 ls. 다음 디렉토리를 예로 들어 보겠습니다.

$ ls
alpha  brave  bravo  charlie  delta

이제 실행하면 ls |grep '^[brav]'다음을 얻습니다.

$ ls |grep '^[brav]'
alpha
brave
bravo

보시다시피, 내가 얻을 뿐만 아니라 brave문자 클래스가 해당 목록에서 문자를 가져오기 때문에 bravo얻을 수도 있습니다 .alpha[]

따라서 실행하면 ls |grep '[^brav]'brav 문자가 포함되지 않은 모든 파일을 얻게 됩니다.어딘가에이름으로.

$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta

모든 파일에는 최소한하나문자 클래스에 포함되지 않는 문자입니다.

Kanvuanza가 말했듯이 문자가 아닌 "용어"에 대한 반의어를 찾기 위해 grep하려면 t e r mgrep을 사용해야 합니다 grep -v.

예를 들어:

$ ls |grep -v 'brav'
alpha
charlie
delta

또한 파일에 클래스의 문자가 포함되지 않도록 하려면 을 사용하세요 grep -v '[term]'. 이렇게 하면 해당 문자가 포함된 파일이 표시되지 않습니다. (Kanwanza의 답변)

예를 들어:

$ ls |grep -v '[brav]'

보시다시피, 이 디렉토리의 모든 파일에는 이 클래스의 문자가 하나 이상 포함되어 있으므로 파일이 나열되지 않습니다.

부록:

PCRE를 사용하면 정규식만 사용하여 부정적인 표현을 사용하는 콘텐츠를 필터링할 수 있다는 점을 덧붙이고 싶습니다. 이를 위해 부정적인 예측 정규식을 사용할 수 있습니다: (?!<regex>).

따라서 위의 예를 사용하면 플래그를 사용하지 않고도 원하는 결과를 얻기 위해 비슷한 작업을 수행할 수 있습니다 grep.

$ ls | grep -P '^(?!brav)'
alpha
charlie
delta

이 정규식을 분해하기 위해 먼저 줄의 시작 부분과 일치한 ^다음 일치하지 않는 문자열을 찾습니다 brav. Only alpha, charliedelta일치하므로 이것들만 인쇄됩니다.

답변2

내 생각엔 그 grep -v로고가 당신이 원하는 대로 작동하는 것 같아요. ~에서매뉴얼 페이지:

-v, --invert-match
    Invert the sense of matching, to select non-matching lines.

이를 사용하여 ls /directory | grep -v [term]일치하지 않는 줄을 인쇄할 수 있습니다.

관련 정보