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 m
grep을 사용해야 합니다 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
, charlie
및 delta
일치하므로 이것들만 인쇄됩니다.
답변2
내 생각엔 그 grep -v
로고가 당신이 원하는 대로 작동하는 것 같아요. ~에서매뉴얼 페이지:
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
이를 사용하여 ls /directory | grep -v [term]
일치하지 않는 줄을 인쇄할 수 있습니다.