이런 문자를 주면
./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은 최소한 줄 수만큼 큽니다. )