在bash函数中Perl的\ K.

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)

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

Ini*_*ian 5

\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)