我在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:
sed -i -- "s/compile \'com.test.*:.*\'/compile \'com.test.*:+\'/g" moo.txt
但这会使文件看起来像:
compile 'com.test.*:+'
compile 'com.test.*:+'
compile 'com.test.*:+'
如何正确使用替换字段中的通配符?
答案 0 :(得分:3)
您在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
,我们应该\(...\)
。
另请注意,您正在转义单引号,而没有必要,因为您在双引号内。
答案 1 :(得分:1)
$ sed -E "s/[^:]+$/+'/" moo.txt
compile 'com.test.common:+'
compile 'com.test.streaming:+'
compile 'com.test.ui:+'
[^:]+$
匹配行尾<{li}>以外的所有字符:
以避免在使用双引号时解释shell的可能性要仅在第一行符合sed -E 's/[^:]+$/+\x27/'
行
compile 'com.test