当我这样做
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
是在插入 \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"
}
关于regex - Perl 的\K in bash 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49795090/