我在.yml文件中有一个URL,该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,我会得到一个新的数字,其中新的数字附加到旧的数字中。网址如下:
https://blog.com/public/1534248704/static151234567/static
请让我知道如何完全替换此错误,或者我在这里做错了什么!
答案 0 :(得分:0)
我修改了示例以更简单地显示问题和解决方案,将其更改为适合实际用例的情况留给了用户
$ # 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)?/
似乎更适合单行中有多个替换项