首页 > 解决方案 > Ubuntu sed - 在 URL 中追加而不是替换

问题描述

我在 .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

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

标签: bashsedubuntu-16.04

解决方案


我修改了示例以更简单的方式显示问题和解决方案,将其更改为适合实际用例留给用户

$ # 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/是它取决于正则表达式引擎的实现。On 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)?/当单行中有多个替换时,似乎更适合


推荐阅读