문제가 있으며 가능한 해결책을 찾으려고 노력 중입니다.쉿. Bash를 사용할 수 있으면 다음 코드가 작동합니다.
ls /a|grep ^[0-9]
불행하게도 sh의 경우에는 그렇지 않습니다. 예, sh를 사용해야 합니다. :) 실행 sh 나는 얻을
ls /a |grep ^[0-9]
[0-9]: not found
Usage: grep -hblcnsviw pattern file . . .
^를 제거하면 코드는 작동하지만 숫자가 포함된 파일이 아닌 숫자로 시작하는 파일만 필요합니다. 예를 들어 다음과 같은 파일이 필요합니다.
12.00.2
2.222.1234.12
grep 매뉴얼 페이지에서 ^
.
현재 내 구현은 다음을 사용하여 이루어집니다.
ls /a|grep -v [a-z]|grep -v [A-Z]
이렇게 하면 문자가 포함된 모든 파일이 삭제되지만 파일이 .123.33인 경우 계속 표시됩니다.
답변1
다음과 같은 것이 당신에게 도움이 될 것입니다:
ls /a | egrep "^[0-9]"
이는 @Anthons의 피드백에 따라 egrep
더 이상 사용되지 않으므로 -E
토글을 일반 명령으로 사용할 수 있습니다 grep
.
ls /a | grep -E "^[0-9]"
@Stephane의 피드백을 바탕으로 함확장하다이 경우 정규식(ERE)도 필요하지 않습니다. 정말 중요한 것은 ^[0-9]
문제가 있는 어떤 버전을 사용하든 해석되지 않도록 하는 인용문입니다 . /bin/sh
따라서 다음과 같은 방법이 문제를 해결하는 가장 쉬운 방법이 될 것입니다.
ls /a | grep "^[0-9]"
-또는-
ls /a | grep '^[0-9]'
답변2
sh
90년대 중반 이전 대부분의 Unix 시스템의 셸이었고 /bin/sh
Solaris 11 이전의 Solaris에서 사용되었던 Bourne 셸을 말씀하시는 것 같습니다 .
Solaris 10 및 이전 버전에서는 사용하지 마십시오 /bin/sh
. 해당 쉘은 다른 시대의 것입니다. 대신 사용하십시오 /usr/xpg4/bin/sh
.
Bourne 쉘에는 이전 쉘인 Thompson 쉘과의 호환성을 ^
위한 별칭이 있습니다. |
따라서 귀하의 명령은 다음과 같습니다.
ls /a|grep |[0-9]
Bourne 쉘은 호출된 명령을 찾을 수 없다고 보고 [0-9]
하고 grep
인수가 수신되지 않았다고 불평합니다.
Bourne Shell이 아닌 표준을 사용하는 경우에도 sh
이를 인용하는 것이 좋습니다 . 예를 들어 ^
확장 전역 옵션이 활성화되면 ^
전역 연산자입니다 .zsh
어쨌든 그렇지 않은 경우 와일드카드이므로 ^
인용해야 합니다 . 현재 디렉토리에 있는 한 자리 이름의 파일 목록으로 셸을 확장합니다.[0-9]
[0-9]
그래서:
ls /a | grep '^[0-9]'
그런데 Bourne 쉘에서는
ls /a ^ grep '^[0-9]'
작동할 것입니다.
답변3
필요하지 않으며 ls
이를 grep
위해 간단한 것을 사용할 수 있습니다.전반적인 상황 /a/[0-9]*
:
echo /a/[0-9]*
ls /a/[0-9]*
grep foo /a/[0-9]*
스크립트에서 이것을 사용하는 경우 참고하세요출력을 구문 분석하는 ls
것은 나쁜 생각입니다..
답변4
나는 l0b0 grep이 여기서 나쁜 생각이라는 데 동의하지만 어쨌든 여기에 문제에 대한 설명과 해결 방법이 있습니다. Solaris 10 이하에서는 /bin/sh
더 이상 사용되지 않는 셸이므로 레거시 스크립트 실행 이외의 용도로 사용하면 안 됩니다. 대신에 ksh
, bash
또는 를 사용해야 합니다 /usr/xpg4/bin/sh
.
여기서 근본 원인은 ^
초기 Unix 시절에 파이프가 지정된 원시적인 방식 때문입니다. 솔라리스는 /bin/sh
이러한 고고학적 특성을 물려받았습니다.
해결 방법은 매우 간단합니다. 다음 방법 중 하나로 캐럿을 이스케이프 처리하면 됩니다.
ls /a |grep \^[0-9]
또는
ls /a |grep "^[0-9]"
또는
ls /a |grep '^[0-9]'