sed 명령은 e 플래그와 함께 작동하지만 E와는 작동하지 않습니다.

sed 명령은 e 플래그와 함께 작동하지만 E와는 작동하지 않습니다.

#처음에 추가 해야 하는 문자열이 있습니다 . [ -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.

  1. 문자열의 [ -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'
    

    작동하지 않습니다.

  2. 전체 문자열의 경우 [ -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" 제거는 스크립트가 하나만 있는 경우에만 작동합니다. 어차피 중복되기 때문입니다.

관련 정보