Bash函数中的Perl' \ K

时间:2018-04-12 11:14:56

标签: regex linux bash perl

当我这样做时

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

问题

任何人都可以解释为什么它不这样做吗?

1 个答案:

答案 0 :(得分:5)

您的\K.*完全错误,您所做的是^$string.*\K已匹配整行(.*贪婪),然后再插入\K量词,这意味着插入发生在整行匹配之后。您应该将其更改为

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

这样,您可以在搜索字符串后处理正确的间距,然后添加替换部件。此外,您不需要在shell函数中使用function关键字,也只需删除()并执行

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