regex - Perl 的\K in bash 函数

标签 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

问题

谁能解释为什么它不这样做?

最佳答案

你的 \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/

相关文章:

linux - 运行 cron 不到一分钟 - laravel

linux - 为什么我的 mac 终端的 ps -u 不工作?

regex - 在与 sed 的最后一场比赛之后追加行

regex - Invision电源板中修改的YouTube链接所需的媒体标签正则表达式代码

android - 如何在 Kotlin 中使用 Regex 替换 Android WebView 中的链接

java - 从字符串中提取单词的正则表达式

regex - 我可以内省(introspection)正则表达式的插值吗?

python - Linux Python 2.7 odbc 连接到 Progress Open Edge DB

linux - 从 Unix 迁移到 powershell,对比 Windows 上的 Cygwin

linux - Bash:在脚本中执行多命令行字符串