정규식과 일치하는 문자열의 일부를 추출하고 싶습니다. 올바르게 실행되는 다음 코드를 고려하세요.
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는 aa
by가 포함된 모든 줄을 올바르게 대체합니다 aa
.
답변3
sed의 동작은 정확합니다. 입력 문자열 EDITED를 인쇄합니다. 분명히 입력 문자열에 지정된 토큰과 일치하는 항목이 없으면 결과는 입력 문자열입니다. regex="aa"인 경우 평가된 태그가 일치하지 않으며 print="blossom"입니다.
답변4
"sed"를 사용하지 않으려면 다음이 작동해야 합니다.
[[ $string == *$regex* ]] && echo $regex