当我这样做时
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
问题
任何人都可以解释为什么它不这样做吗?
答案 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"
}