그룹 grep 명령

그룹 grep 명령

나는 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]\*"

관련 정보