패턴 "^-0+([0-9]+)"는 "^-0+([1-9]+)"와 동일합니까?

패턴 "^-0+([0-9]+)"는 "^-0+([1-9]+)"와 동일합니까?

Jeff는 다음과 같이 썼습니다.음수로 명명된 파일 이름에 대한 매개변수 확장 오류

[[ $b =~ ^-0+([0-9]+)$ ]] && b=-${BASH_REMATCH[1]}이 시점에서 가장 좋은 방향은 음수일 수 있는 숫자에서 앞에 오는 0을 제거하는 것과 같은 작업을 수행하는 것입니다.

0패턴의 시작번호가 꼭 필요한지 궁금합니다. 즉, ^-0+([0-9]+)패턴이 와 동일합니까 ^-0+([1-9]+)? 감사해요.

답변1

아니요, ^-0+([1-9]+)그런 숫자는 일치하지 않습니다 -320.

-320편집: 패턴을 다시 읽으면 실제로 불일치에 대한 두 가지 이유가 있습니다 .

  1. 0뒤에는 '가 없습니다 -( +반드시 있어야 한다고 말합니다). 그러나 이는 두 모드의 차이점이 아니며 결함일 수도 있습니다.

  2. 00이 아닌 첫 번째 숫자 뒤에는 패턴 간의 차이가 있습니다.

답변2

동일한 문자열에 대한 일치 여부는 ^-0+([0-9]+)로케일에 따라 다릅니다. C/POSIX 로케일에서는 동일한 문자열( 및 포함)과 일치하지만 캡처하는 내용은 다를 수 있습니다(예: 전자는 에서 캡처하고 후자는 에서 캡처).^-0+([1-9]+)$-01foo-00230bar(...)230-00230bar23

@Henrik이 제안한 대로 를 사용하면 $동일한 문자열에서 일치하지 않습니다. ^-0+([1-9]+)$일치하지 않습니다 -00230.

다른 지역에서는 마일리지가 다를 수 있습니다. 예를 들어, en_GB.UTF-8Solaris 10 시스템의 로케일 에서 on은 중간에 정렬된 문자이므로 일치 ^-0+([0-9]+)하므로 or 는 일치 하지만 ⓿ 또는 ⓿는 일치하지 않습니다.-0⓿⓿1201[0-1][0-9]^-0+([1-9]+)0+[1-9]

완전성을 위해 / 확장 sh에 의존하지 않고 표준 구문을 사용하여 이 작업을 수행 하려면 다음을 수행할 수 있습니다.bashksh93

case ${b#-0} in
  ("$b" | "" | *[![:digit:]]*) echo >&2 no match;;
  (*) b=${b#"${b%%[!0-]*}"};;
esac

여기서의 이점은 [[:digit:]]( 와는 반대로 [0-9]) 단지 일치한다는 것 입니다 0123456789.

관련 정보