#
처음에 추가 해야 하는 문자열이 있습니다 . [ -n "$ID" -a "$ID" -le 200 ] && return
즉 #[ -n "$ID" -a "$ID" -le 200 ] && return
, 다음 명령을 사용할 수 있습니다.
echo '[ -n "$ID" -a "$ID" -le 200 ] && return'| sed -n -e 's/\[ -n "$ID" -a "$ID" -le 200 \] && return/#&/p'
효과가있다. 이제 플래그에 관해 두 가지 질문이 있습니다 E
.
문자열의
[ -n "$ID" -a "$ID" -le 200 ]
경우 대괄호를 이스케이프하면 작동하지 않습니다. 그러나 이스케이프하지 않으면 작동합니다.sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ]/#&/p'
동시에 작업
sed -n -E 's/\[ -n "$ID" -a "$ID" -le 200 \]/#&/p'
작동하지 않습니다.
전체 문자열의 경우
[ -n "$ID" -a "$ID" -le 200 ] && return
이스케이프하지 않으면 잘못된 대답이 제공됩니다.echo '[ -n "$ID" -a "$ID" -le 200 ] && return'| sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ] && return/#&/p'
그것은 나에게 출력을 제공합니다 :
[ -n "$ID" -a "$ID" -le 200 #] && return
어떻게 작동하는지 알고 싶습니다.
답변1
sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ]/#&/p'
예상한 대로 작동하지 않습니다. 이는 우연에 가깝습니다. [...]
일치하는 문자 집합입니다. 이 세트에서 범위 -n
는 공백(0x20)부터 (0x6E)까지이며 로케일에 따라 (0x5B)를 n
포함할 수 있습니다 . [
따라서 세트는 첫 번째 문자와 일치합니다. #&___
대체 역할을 하면 어떻게 되는지 보세요 ... 그런 의도는 아닌 것 같은데요?
이것이 전체 케이스가 실패하는 이유입니다. 세트에 대해 일치하는 문자는 ]
패턴의 나머지 부분이 뒤에 오기 때문에 해당 #
문자가 거기에 삽입되는 이유입니다.
확장 정규식의 문제는 @steeldriver 가정: $
앵커 패턴과 같습니다.
대괄호 표현식 외부의 ( '$' )는 닫는 표현식 또는 하위 표현식을 문자열 끝에 고정합니다. 이러한 표현식 또는 하위 표현식은 문자열 시퀀스의 마지막 문자로 끝나는 표현식과만 일치할 수 있습니다. 예를 들어, ERE "ef$" 및 "(ef$)"는 문자열 "abcdef"의 "ef"와 일치하지만 "cdefab" 문자열에서는 실패하고 ERE "e$f"는 작동하지만 일치하지 않습니다. "f"는 "e$" 표현식이 마지막 문자로 끝나는 내용과 일치하는 것을 방지하기 때문입니다.
따라서 ERE에서는 리터럴을 $
이스케이프해야 하지만 BRE에서는 패턴의 마지막 문자인 경우에만 이스케이프해야 합니다.
또한 -e
다음 매개변수는 스크립트로 표시됩니다. 스크립트가 하나만 있는 경우 이 매개변수는 선택사항 -E
이지만 스위치입니다. -e
"-E" 제거는 스크립트가 하나만 있는 경우에만 작동합니다. 어차피 중복되기 때문입니다.