San*_*ing 3 regex linux bash perl
当我做
function replace { ( perl -i -slpe 's/^$string.*\K/$add/' -- -string="$1" -add="$2" $3 ) }
replace 'passwd:' 'files dns' /tmp/1
Run Code Online (Sandbox Code Playgroud)
我明白了
passwd: filesfiles dns
group: files
Run Code Online (Sandbox Code Playgroud)
应该是的
passwd: files dns
group: files
Run Code Online (Sandbox Code Playgroud)
输入文件是
passwd: files
group: files
Run Code Online (Sandbox Code Playgroud)
题
任何人都可以解释为什么它不这样做?
你\K和你.*一共都在错误的地方,你所做的就是在插入量词之前^$string.*\K就已经匹配了整行(.*贪心),\K这意味着在整行匹配后发生插入.您应该将其更改为更有效
perl -i -slpe 's/^$string\s+\K.*/$add/' -- -string="$1" -add="$2" "$3"
Run Code Online (Sandbox Code Playgroud)
这样,您可以在搜索字符串后处理正确的间距,然后添加替换部件.此外,您不需要functionshell函数中的关键字,也可以()完全删除它
replace () {
perl -i -slpe 's/^$string\s+\K.*/$add/' -- -string="$1" -add="$2" "$3"
}
Run Code Online (Sandbox Code Playgroud)