\\$\{를 사용한 정규 표현식이 egrep에서는 작동하지만 sed에서는 작동하지 않는 이유는 무엇입니까?

\\$\{를 사용한 정규 표현식이 egrep에서는 작동하지만 sed에서는 작동하지 않는 이유는 무엇입니까?

이런 문자를 주면

./RFF_09 -f${FILE} -c${COND}

파일 내에서 이 egrep 명령은 올바르게 일치합니다.

egrep './RFF(.*) (.*)-c\\$\{COND\}' file

하지만 이 sed 명령은 그렇지 않습니다.

sed -n "s:'./RFF(.*) (.*)-c\\$\{COND\}':./RFF$1 $2-cRFF$1:gp"

그것은 실패할 것이다 sed: -e expression #1, char 38: invalid content of \{\}. 나도 시도했다

sed -n "s:'./RFF(.*) (.*)-c\\$\{COND\}':DUMMY:gp" file
sed -n s:'./RFF(.*) (.*)-c\\$\{COND\}':DUMMY:gp file

같은 결과를 얻었습니다.

sed -n "s:'./RFF(.*) (.*)-c\\$\\{COND\\}':DUMMY:gp" file

오류 메시지는 표시되지 않지만 일치하지 않습니다.

내가 뭘 잘못했나요? 아니면 더 나은 방법은: 원래 명령에서 제안한 대로 텍스트를 어떻게 바꿀 수 있습니까? 저는 꽤 오래된 버전의 sed(4.1.2)와 egrep(2.5.1)을 사용하고 있기 때문에 최신 버전에서 오류를 재현할 수 없더라도 해결 방법이 있습니다.

답변1

당신이 사용하는 경우이자형grep은 grep이 정규식 구문을 확장했음을 의미하므로 패턴을 sed로 전송하려면 매개변수를 추가 -r(--regexp-extended)하거나 -E일부 버전에 있어야 합니다.

표현에 관해서는 여분이 있으므로 \egrep c을 사용해도불일치

\1또한 $1역 매칭을 사용하는 것이 좋습니다.

따라서 최종 명령은 다음과 같습니다.

sed -rn 's:\./(RFF.*)( .* -c)\$\{COND\}:./\1\2\1:gp'

또는

sed -rn 's:(\./(RFF\S*) \S* -c)\$\{COND\}:\1\2:gp'

답변2

원래 진술에서 문제는 문법적 의미와 문자적 의미를 혼합했다는 것입니다.인용 부호: 큰따옴표 안의 작은따옴표는 문자 그대로 일치됩니다. 간단히 제거하거나 따옴표를 혼합하면 됩니다(아니요중첩). 테스트되지 않은 예:

sed 's/foo/{bar}/'
sed "s/foo/"'{bar}'"/"

많이있다정규식 스타일이며 모두 다른 구문을 지원합니다. 작은 따옴표만 사용한 시도에서 문제는 정규식 스타일입니다. 개수 를 일치시키 sed려면 정수여야 합니다. 을 사용하고 싶을 것입니다 .\{N\}N{COND}

(실제로 이제 문제를 해결하기 위해 정규식을 사용한다는 것은 다음을 의미합니다.질문. 쉘 코드에서 복잡한 거의 모든 작업을 수행한다는 것은 N 문제에 직면하게 된다는 것을 의미합니다. N은 최소한 줄 수만큼 큽니다. )

관련 정보