비슷한 질문이 있습니다스택 오버플로, 그러나 bash에서는 작동하지 않습니다.
스크립트/변수를 사용하여 bash와 작동하려면 무엇이 필요합니까?
저는 ISO 639-1 또는 ISO 639-2 코드에 대해 이야기하고 있습니다.
내 배쉬는 GNU 4.3입니다.
예:
root@box ~/test2 # ls
eng en-US por pt-BR
이 페이지의 정규식은 실패합니다.
root@box ~/test2 # ls | grep ^[a-z]{2}-[A-Z]{2}$
root@box ~/test2 # ls | grep ^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$
-bash: syntax error near unexpected token `('
root@box ~/test2 # ls | grep ^[a-z]{2}(-[A-Z]{2})*
-bash: syntax error near unexpected token `('
root@box ~/test2 # ls | grep "^[a-z]{2}(-[A-Z]{2})*"
답변1
{n}
백슬래시가 없으면 확장 정규식의 일부이므로 -E
grep 플래그가 필요합니다. 또한 보시다시피 괄호와 중괄호는 셸에서 특별한 의미를 갖기 때문에 정규식을 인용하려고 합니다.
$ ls
eng en-US por pt-BR
$ printf "%s\n" * | grep -E '^[a-z]{2}-[A-Z]{2}$'
en-US
pt-BR
$ printf "%s\n" * | grep -E '^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$'
eng
en-US
por
pt-BR
아니면 그냥 Bash를 사용하세요:
$ for f in * ; do
[[ $f =~ ^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$ ]] && printf "%s\n" "$f" ; done
eng
en-US
por
pt-BR
( [[ .. ]]
테스트 구조는 특별합니다. 중괄호와 괄호는 그 안에서 다른 의미를 갖습니다. 실제로 정규식은 다음과 같아야 합니다.인용되지 않음여기. 이는 와 동일하지 않습니다 [ .. ]
.BashGuide의 조건문 가이드)
이 [a-zA-Z]{1,8}
부분은 최대 8자의 문자열과 일치하며, 마지막 부분은 *
괄호 안의 그룹이 여러 번 반복될 수 있도록 허용하므로 이와 foobar-foobar-foobar
유사한 것과도 일치합니다.
필요한 경우 ^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,3})?$
두 글자 또는 세 글자와 후행 부분이 있는 코드만 허용하도록 패턴을 변경할 수 있습니다 .-xx
따옴표가 {1,8}
없으면버팀대 확장:
$ echo ^[A-Za-z]{1,8}
^[A-Za-z]1 ^[A-Za-z]8
따옴표가 []
없으면파일 이름 패턴 일치(glob)...
$ touch "^a1" "^b8"
$ echo ^[A-Za-z]{1,8}
^a1 ^b8
답변2
먼저 regex
grep에서 요구하는 대로 참조를 사용해야 합니다.grep 'regex'
egrep
그런 다음 or를 사용하여 grep에서 확장 정규식 지원을 사용할 수 grep -E
있으며 작동합니다.
$ ls | egrep '^[a-z]{2}-[A-Z]{2}$'
또는 클래식 grep(기본 정규식)을 사용할 수 있지만 이스케이프가 필요 {
합니다 }
.
$ ls | grep '^[a-z]\{2\}-[A-Z]\{2\}$'
귀하의 질문을 바탕으로 이 데이터를 얻으세요
$ ls
eng
en-US
main.sh
por
pt-BR
grep의 두 경우 모두 출력은 다음과 같습니다.
en-US
pt-BR
답변3
- 이는 확장된 정규 표현식이므로 다음을 사용하세요.
-E
- 특수 문자가 포함된 검색 패턴을 사용하는 경우 이를 인용하세요.
grep -E "^[a-z]{2}-[A-Z]{2}$"