sh 및 grep 번호만

sh 및 grep 번호만

문제가 있으며 가능한 해결책을 찾으려고 노력 중입니다.. 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

sh90년대 중반 이전 대부분의 Unix 시스템의 셸이었고 /bin/shSolaris 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]'

관련 정보