sed는 전체 정규식 일치와 일치 없음을 구별하지 않습니다.

sed는 전체 정규식 일치와 일치 없음을 구별하지 않습니다.

정규식과 일치하는 문자열 부분을 추출하고 싶습니다. 올바르게 작동하는 다음 코드를 고려해보세요.

regex="ss"
string="blossom"
echo $string | sed "s/^.*\($regex\).*$/\1/"

출력은 다음과 같습니다

ss

그러나 정규 표현식이 아무것도 일치하지 않으면 전체 문자열이 반환됩니다.

regex="aa"

산출:

blossom

이것은 잘못된 것입니다. 일치하는 항목이 없으면 아무것도 반환되어서는 안 됩니다. 이것이 어떻게 이루어질 수 있습니까?

답변1

choroba가 말했듯이 sed는 기본적으로 항상 일치하는 대체 항목을 사용하여 줄을 인쇄합니다. 다음을 사용하여 원하는 것을 할 수 있습니다.

regex="ss"
string="blossom"
echo $string | sed -n "s/^.*\($regex\).*$/\1/p"

-n은 sed에게 해당 행을 인쇄하지 말라고 지시하고, s/ 명령 끝에 있는 p는 sed에게 일치하는 항목이 있으면 대체 항목과 함께 해당 행을 인쇄하도록 지시합니다.

답변2

당신의 해석이 잘못되었습니다. 당신은 sed어떤 것을 다른 것으로 바꾸라고 말했습니다 . 교체할 항목을 찾지 못했는데 왜 삭제해야 합니까? 즉, 대체는 일치하는 항목을 대체하며 일치하지 않는 줄은 건드리지 않습니다. 또는 또 다른 재구성: sed가 aaby를 포함하는 모든 행을 올바르게 대체했습니다 aa.

답변3

sed의 동작이 올바른 경우 입력 문자열 EDITED를 인쇄합니다. 분명히 주어진 토큰과 입력 문자열에서 일치하는 항목이 없으면 결과는 입력 문자열 그대로입니다. regex="aa"일 때 평가된 토큰이 일치하지 않고 = "blossom"을 인쇄합니다.

답변4

'sed'를 사용하지 않고 진행하려면 다음이 작동합니다.

[[ $string == *$regex*  ]] && echo $regex

관련 정보