Ubuntu sed - 在 URL 中追加而不是替换

Ubuntu sed - appends in URL instead of replacing

我在 .yml 文件中有一个 URL,它的类型如下:

https://blog.com/public/

https://blog.com/public/1534248704/static

上面URL中的数字我不认识。

我必须用生成的新随机数替换文件中的这些 url 模式,所以它看起来像:

https://blog.com/public/151234567/static

我使用的命令是:

sed -i 's, https://blog.com/public/, https://blog.com/public/151234567/static,g' config.yml

如果我只有一个 URL 没有数字(第一个 URL),它工作得很好,但是如果 URL 有一个数字,而不是得到替换的 URL,我得到一些东西,其中新号码附加到 URL 中的旧号码,如下所示:

https://blog.com/public/1534248704/static151234567/static

请让我知道如何完全替换它或我在这里做错的地方!

我修改了示例以更简单的方式展示问题和解决方案,更改它以适应实际用例留给用户

$ # here only 'cat' will be replaced
$ echo 'cat cater' | sed 's/cat/dog/g'
dog doger

$ # here both 'cat' and 'cater' will be replaced
$ # -E option to enable ERE, some sed versions would need -r instead of -E
$ echo 'cat cater' | sed -E 's/cat|cater/dog/g'
dog dog
$ # using group and quantifier to simplify regex
$ echo 'cat cater' | sed -E 's/cat(er)?/dog/g'
dog dog

$ # possible cases to take care of
$ echo 'concat catered' | sed -E 's/cat(er)?/dog/g'
condog doged


/cat|cater/ 的另一个问题是它依赖于正则表达式引擎的实现。在 GNU sed 上,顺序无关紧要,最长的匹配将获胜,不确定其他实现...这是 perl

的示例
$ echo 'cat cater' | perl -pe 's/cat|cater/dog/g'
dog doger
$ echo 'cat cater' | perl -pe 's/cater|cat/dog/g'
dog dog
$ echo 'cat cater' | perl -pe 's/cat(er)?/dog/g'
dog dog

所以,/cat(er)?/ 似乎更适合单行中有多个替换的情况