나는 grep
으로 시작 s
하고 포함 하고 싶지 않습니다 m
.
나는 효과가 있는 이 솔루션을 시도했습니다.
ls | grep -Ev "^s" | grep "m"
grep
그러나 단일 명령으로 이 작업을 수행 하려고 하면 실패합니다.
ls | grep -E '^[^s]*m*'
이유를 설명할 수 없습니다. 단 하나의 명령으로 수행할 수 있습니까 grep
?
답변1
이건 필요하지 않습니다 grep
.
printf '%s\n' [!s]*m*
시험:
$ touch small big larger enormous much
$ ls -l
total 0
-rw-r--r-- 1 kk wheel 0 Oct 24 13:20 big
-rw-r--r-- 1 kk wheel 0 Oct 24 13:20 enormous
-rw-r--r-- 1 kk wheel 0 Oct 24 13:20 larger
-rw-r--r-- 1 kk wheel 0 Oct 24 13:20 much
-rw-r--r-- 1 kk wheel 0 Oct 24 13:20 small
$ printf '%s\n' [!s]*m*
enormous
파일 이름 와일드카드 패턴 [!s]*m*
은 로 시작하지 s
않지만 m
.
m
그러나 첫 번째 문자만 포함된 파일 이름 은 찾지 않습니다 .
m
또는 로 시작 하지 않지만 s
를 포함하는 파일 m
과 ,로 시작하는 파일을 각각 찾아 이를 수행할 수 있습니다 m
. 유지 관리가 약간 번거롭고 코드를 읽어도 그것이 무엇을 하는지 즉시 명확하지 않습니다.
$ printf '%s\n' [!ms]*m* m*
enormous
much
또는 find
읽기 쉬운 IMHO를 사용하세요.
$ find . -maxdepth 1 -name '[!s]*' -name '*m*'
./enormous
./much
답변2
*
정규식에 잘못된 내용을 사용하고 계신 것 같습니다.
사양(grep의 매뉴얼 페이지 참조)에는 다음과 같이 명시되어 있습니다.
* The preceding item will be matched zero or more times.
따라서 정규 표현식은 "문자 이외의 것으로 시작하는 모든 파일 이름과 일치하고 s
, 0회 이상 일치하고, 문자가 0회 이상 일치합니다 m
." 를 의미합니다.
정규식은 다음과 같이 변경되어야 합니다.
ls | grep -E '^[^s][[:alnum:]]*m'
즉, 당신은 지적해야무엇기호는 "m" 앞에 0번 이상 나타나야 하며, 귀하의 경우 어떤 영숫자 문자도 괜찮습니다. 파일 이름에 -
또는 가 포함될 수 있는 경우 로 _
바꾸십시오 .[[:alnum:]]
[[:print:]]
극단적인 경우, 파일 이름도 작동하는 경우시작를 사용할 때 m
정규식은 다음과 같습니다.
ls | grep -E '(^m|^[^s][[:print:]]*m)'
답변3
우선, 파싱하면 안 됩니다 ls
. 그 외에는 그에 대한 질문에 답변해 드리겠습니다 grep
.
당신이 사용을 고집한다면 grep
당신이 원하는 것은 다음과 같습니다 :
grep -E "^[a-rt-zA-RT-Z][[:alnum:]]*m" file
실제로 다음 없이도 작동합니다 -E
.
grep "^[a-rt-zA-RT-Z][[:alnum:]]*m" file
s
이는 or 이외의 문자로 시작하는 모든 문자를 인쇄 S
한 다음 포함된 영숫자 문자 m
와 그 이후의 모든 문자를 인쇄합니다 m
. 실제로 그것은 당신이 찾고 있는 결과를 제공합니다.
printf
위의 첫 번째 솔루션은 구문 분석이 필요하지 않으므로 파일을 처리할 때 훨씬 더 좋습니다 ls
. 위의 방법을 파일 이름과 함께 사용할 수 있지만 grep
이에 반대하는 것이 좋으며 파일 콘텐츠 또는 데이터와 함께 사용하는 것이 좋습니다.
find
구문 분석이 필요하지 않으므로 파일 에도 사용할 수 있습니다 .
find /path/to/directory -type f -name "*m*" -name "[!s]*"
환경에 따라 탈출해야 할 수도 있습니다.*
find /path/to directory -type f -name "\*m\*" -name "'[!s]\*"