하나의 문자열은 포함하고 다른 문자열은 포함하지 않는 경우 sed를 적용하는 방법은 무엇입니까?

하나의 문자열은 포함하고 다른 문자열은 포함하지 않는 경우 sed를 적용하는 방법은 무엇입니까?

이걸 변환하려고 하는데

url = ssh://[email protected]/project/repo.git

도착하다

url = ssh://[email protected]/scm/project/repo.git

그러나 이는 단순한 sed찾기 및 바꾸기가 아닙니다. \turl문자열이 로 시작하고 포함하지 않는 경우 에만 찾기 및 바꾸기를 적용하고 싶습니다 scm.

다음을 포함하는 행만 대체하는 시작 섹션이 있습니다.\turl

cat .git/config | sed "/\turl/ s=\.com\/=\.com\/scm\/=g"

scm하지만 멱등성을 가지게 하기 위해 이미 문자열이 포함되어 있는지 확인할 수 없습니다 . 그렇지 않고 seds를 사용하여 명령을 계속 실행하면 -i계속해서 scm.

답변1

sed에서는 다음과 같이 작동합니다.

sed '/url/ { /scm/! s=\.com/=\.com/scm/=g }'

주소를 추가하여 무효화할 수 있으며 !, 블록을 사용하여 주소 정규식을 다른 주소 정규식에 적용할 수 있습니다.

아니면 다음 사항을 확인해야 하는 scm경우 도 있습니다..com/

sed '/url/ { \=\.com/scm/= ! s=\.com/=\.com/scm/=g }'

답변2

! grep -q '/scm/' .git/config && sed "/\turl/ s=\.com\/=\.com\/scm\/=g" .git/config

또는

grep -q '/scm/' .git/config || sed "/\turl/ s=\.com\/=\.com\/scm\/=g" .git/config

파일에 가 포함되어 있지 않으면 /scm/sed...

관련 정보