왜 ] 를 sed와 일치시킬 수 없나요?

왜 ] 를 sed와 일치시킬 수 없나요?

sed의 문자 집합과 일치시키려고 하는데 어떤 이유로 [마음에 들지 않습니다.]]

$ echo 'foo [bar]' | sed -E 's/[\[\]]//g'
foo [bar]

다음은 작동합니다:

$ echo 'foo [bar]' | sed -E 's/\]//g'
foo [bar
$ echo 'foo [bar]' | sed -E 's/[\[]//g'
foo bar]

그러나 어떤 이유로 ]이 문자 집합의 내부가 이를 깨뜨립니다.

$ echo 'foo [bar]' | sed -E 's/[\]]//g'
foo [bar]

이상하게도 이것은 심지어 작동합니다:

$ echo 'foo [bar]' | sed -E 's/[]]//g'
foo [bar
$ echo 'foo [bar]' | sed -E 's/[[]//g'
foo bar]

하지만 이건 아니다:

$ echo 'foo [bar]' | sed -E 's/[[]]//g'
foo [bar]

일종의 추가 탈출이 필요합니까, 아니면 이것이 가능합니까?

답변1

]대괄호 표현식 내의 or는 [이스케이프할 필요가 없습니다. 대괄호 표현식의 백슬래시는 이스케이프된 의미를 상실하지만 리터럴 백슬래시 문자와 일치합니다. 따라서 이 작업을 수행하면 첫 번째 부분과 두 번째 부분 의 두 문자를 일치시키 [\]]라고 지시 하지만 입력의 문자열이 일치하지 않으므로 아무 것도 변경되지 않습니다. 문자를 일치시키려면 대괄호 표현식에 사용하려는 경우에만 필요하며 , 그렇지 않은 경우 리터럴을 사용할 수도 있습니다.sed\[\]]\]][]]]

또한 대괄호 표현식에서는 [...]해당 문자가 ]첫 번째 문자여야 하므로 's/[[]]//g'이렇게 해야 합니다 's/[][]//g'.

관련 정보