如果 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 ...

相关内容