Bash의 언어 코드와 일치하는 정규식

Bash의 언어 코드와 일치하는 정규식

비슷한 질문이 있습니다스택 오버플로, 그러나 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}백슬래시가 없으면 확장 정규식의 일부이므로 -Egrep 플래그가 필요합니다. 또한 보시다시피 괄호와 중괄호는 셸에서 특별한 의미를 갖기 때문에 정규식을 인용하려고 합니다.

$ 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

먼저 regexgrep에서 요구하는 대로 참조를 사용해야 합니다.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

  1. 이는 확장된 정규 표현식이므로 다음을 사용하세요.-E
  2. 특수 문자가 포함된 검색 패턴을 사용하는 경우 이를 인용하세요.

grep -E "^[a-z]{2}-[A-Z]{2}$"

관련 정보