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)?/
似乎更适合单行中有多个替换的情况
我在 .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)?/
似乎更适合单行中有多个替换的情况