regex Perl正则表达式正向后看以搜索换行符和空格

ulydmbyx  于 2023-05-01  发布在  Perl
关注(0)|答案(2)|浏览(126)

我正在尝试自动更新我的~/.ssh/config file。当我做一个在线正则表达式测试时,它可以像我想的那样使用PCRE 2(所以perl 5。30.3兼容)在regex101上,但是当我尝试在本地机器上复制时,它失败了。
该命令使用正向后看来通读一个单词、一个换行符、四个空格、一个单词、一个空格,然后从该点开始替换直到行尾:
cat ~/.ssh/config | perl -pe 's/(?<=c9\n\s{4}Hostname )ec2.+/TEST/g'
我的~/.ssh/config文件看起来像这样(仅作为示例,为了安全性而更改):

Host c9
    Hostname ec2-xxx.compute.amazonaws.com
    User ec2-user
    IdentityFile ~/.ssh/id_rsa2

使用上面的正则表达式,我希望输出如下所示:

Host c9
    Hostname TEST
    User ec2-user
    IdentityFile ~/.ssh/id_rsa2

它在测试站点上工作,但当我在本地运行时,它一直工作到我在换行符后添加任何空格为止。那么

cat ~/.ssh/config | perl -pe 's/(?<=c9\n)/TEST/g'

给予

Host c9
TEST    Hostname ec2-xxx.compute.amazonaws.com
    User ec2-user
    IdentityFile ~/.ssh/id_rsa2

但下面的代码只是返回了未更改的输入。

cat ~/.ssh/config | perl -pe 's/(?<=c9\n )/TEST/g'

我已经在bash和zsh中进行了测试,并且我正在运行perl 5,版本30,subversion 3(v5)。30.3).感谢任何帮助.1https://regex101.com

zbwhf8kr

zbwhf8kr1#

试试这个:

perl -0 -pe 's/c9(?=\n\s{4})/TEST/g' ~/.ssh/config
idfiyjo8

idfiyjo82#

使用sed查找Host c9(通过/^Host c9$/),然后在下一行(通过n命令),替换主机名(通过s/Hostname ec2.*/Homename TEST/):

cat ~/.ssh/config | sed '/^Host c9$/{n; s/Hostname ec2.*/Homename TEST/;}'

参见live demo

相关问题