sed의 정규식 문자 클래스(예: [abc])에서 순서가 중요합니까?

sed의 정규식 문자 클래스(예: [abc])에서 순서가 중요합니까?

나는 예부터 시작하는 것이 가장 좋다고 생각합니다.

> echo "[20-20:10]Something" | sed -r -e 's/^\[[0-9\:\-]+(.*)$/\1/' 
]Something
> echo "[20-20:10]Something" | sed -r -e 's/^\[[0-9\-\:]+(.*)$/\1/' 
-20:10]Something

유일한 차이점은 정규식 문자 클래스에서 및 문자를 바꿨다는 것입니다 :. -그렇다면 sed의 정규식 문자 클래스에서 문자 순서가 중요합니까? 다음과 같은 다른 정규식 시스템에서는 나에게 중요하지 않은 것 같습니다.https://regex101.com/.

Google에서 이 동작에 대한 정보를 찾을 수 없지만 내 스크립트의 기능을 확실히 알고 싶기 때문에 더 자세히 알고 싶습니다.

답변1

몇 가지 규칙이 있습니다. 이 경우 중요한 것은 이것이 범위 작업이므로 클래스 내부가 아니라 -말할 수 있다는 것입니다 . a를 리터럴 문자로 포함하려면 클래스의 마지막 문자인 것이 가장 쉽지만 범위의 첫 번째 문자이거나 끝 문자일 수 있습니다.a-fabcdef-

문자 집합을 부정하려면 첫 번째 문자가 이어야 합니다 ^. 텍스트로 포함하려면 첫 번째 텍스트가 아니어야 합니다.

클래스가 끝나면 첫 번째( 또는 ]첫 번째 문자가 클래스를 무효화하는 경우 두 번째), 4개 문자 그룹 정도가 될 수 있는 특별한 경우가 있습니다 .^[]abc]a b c]

답변2

[0-9\:\-]예 , 숫자, 백슬래시, 콜론 또는 대시 내의 단일 문자는 일치하지만 [0-9\-\:]대시 는 일치하지 않으므로 이는 중요합니다 . 두 번째 표현식에서 대시는 백슬래시 문자와 백슬래시 문자 사이의 범위를 나타내며(백슬래시는 문자 클래스인 리터럴입니다) 표현식은 와 동일 [0-9\:]합니다 [\0-9:].

정말 대시아니요^문자 클래스에서 첫 번째(아마도 나중) 또는 마지막인 경우 문자 시퀀스를 나타냅니다.

또한 sed귀하가 링크한 사이트가 명시적으로 지원하지 않는 POSIX 정규식을 처리한다는 점에 유의하세요.내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?).

관련 정보