Perl的\ K in bash函数
收藏

当我这样做的时候

function replace { ( perl -i -slpe 's/^$string.*\K/$add/' -- -string="$1" -add="$2" $3 ) } 

replace 'passwd:' 'files dns' /tmp/1

我明白了
passwd:     filesfiles dns
group:      files

应该是的
passwd:     files dns
group:      files

输入文件是
passwd:     files
group:      files

问题
有人能解释为什么它不这么做吗?


最佳答案:

您的\K.*完全不在正确的位置,您所做的是在插入^$string.*\K量词之前匹配整行(.*是贪婪的),这意味着插入发生在整行匹配之后。你应该把它改成更有效的

perl -i -slpe 's/^$string\s+\K.*/$add/' -- -string="$1" -add="$2" "$3"

这样,您就可以在搜索字符串后适当的间距,并在之后添加替换部分。另外,您不需要在shell函数中使用\K关键字,也不需要完全删除function,只需
replace () {
    perl -i -slpe 's/^$string\s+\K.*/$add/' -- -string="$1" -add="$2" "$3"
}

    公众号
    关注公众号订阅更多技术干货!