gpt4 book ai didi

regex - 替换文件中的所有字符串,在替换中使用通配符

转载 作者:行者123 更新时间:2023-11-29 09:46:29 25 4
gpt4 key购买 nike

我在 bash 中使用 sed 来尝试替换所有匹配的字符串:

compile 'com.test.*:*'

与:

compile 'com.test.*:+'

其中 * 是通配符。

我的文件看起来像这样,它叫做 moo.txt:

compile 'com.test.common:4.0.1'
compile 'com.test.streaming:5.0.10'
compile 'com.test.ui:1.0.7'

我希望它看起来像这样:

compile 'com.test.common:+'
compile 'com.test.streaming:+'
compile 'com.test.ui:+'

我试过像这样使用 sed:

sed -i -- "s/compile \'com.test.*:.*\'/compile \'com.test.*:+\'/g" moo.txt

但这使得文件看起来像:

compile 'com.test.*:+'
compile 'com.test.*:+'
compile 'com.test.*:+'

关于如何在替换字段中正确使用通配符有什么想法吗?

最佳答案

您正在匹配 com.test 之后的内容,但您没有正确打印它们。

所以你确实在匹配一些东西,只是你没有把它打印回来。相反,您打印的是文字 .*:

sed "s/compile \'com.test.*:.*\'/compile \'com.test.*:+\'/g"
# ^^ ^^
# match this print back? NO

为此,捕获模式并使用反向引用将其打印回来。

sed -E "s/compile 'com.test(.*):.*'/compile 'com.test\1:+'/g"
# ^^^^ ^^
# catch this print back! now YES!

看到我们重复“编译...”太多了吗?这意味着我们可以将捕获扩展到行的最开头,因为反向引用会将所有内容打印回来:

sed -E "s/^(compile 'com.test.*):.*'/\1:+'/g"
# ^^^^^^^^^^^^^^^^^^^^^ ^^
# capture all of this print it back

请注意使用 -E 以允许 sed 仅使用 (...) 捕获组。如果我们不使用 -E,我们应该使用 \(...\)

另请注意,您正在转义单引号,但没有必要,因为您在双引号内。

关于regex - 替换文件中的所有字符串,在替换中使用通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39289843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com