当前位置:  开发笔记 > 编程语言 > 正文

检查`perl -i -pe`是否进行了任何替换

如何解决《检查`perl-i-pe`是否进行了任何替换》经验,为你挑选了1个好方法。

GNU sed,我可以显示成功替换搜索模式的结果.简单示例如下:

echo -e "nginx.service\nmariadb.service\nphp-fpm.service" > something.conf;
sed -ri 's|(mariadb)(\.service)|postgresql-9.4\2|w sed-output.log' something.conf;
[[ -s sed-output.log ]] && echo "Pattern found and modified. $(cat sed-output.log)" || echo "Pattern not found.";

因为sed在处理多线时有限制,我切换到了perl.

echo -e "nginx.service\nmariadb.service\nphp-fpm.service" > something.conf;
perl -i -pe 's|(mariadb)(\.service)|postgresql-9.4\2|' something.conf;

上面的代码也是这样sed,但我如何将modified content(" postgresql-9.4.service")放入文件或打印出来?

基本上我想要实现的是,在脚本执行之后,它告诉我它是否成功(以及实际替换的是什么),如果没有,我将显示一条无法找到和替换的消息.


编辑:
突出显示我想得到(only-the-)modified content,这表明我的脚本成功了.因为perl -i -pe 's/pattern/replace/' file,我不知道它是返回真还是假.当然,我可以简单grep -E "/pettern/"地找出答案,但这不是问题.



1> Juan Diego G..:

此代码将抛出一个等于替换完成0时的退出代码:

$ perl -i -pe '$M += s|(mariadb)(\.service)|postgresql-9.4\2|;END{exit 1 unless $M>0}' something.conf
$ echo $?
0

没有替换时,返回代码将是1:

$ perl -i -pe '$M += s|(maria)(\.service)|postgresql-9.4\2|;END{exit 1 unless $M>0}' something.conf
$ echo $?
1

Perl 文档

一个END码块执行尽可能晚,即,perl的已经完成运行程序和之后要退出的解释之前,即使是离开作为模具()函数的结果.(但如果它通过exec变成另一个程序,或者被信号吹出水面则不会 - 你必须自己陷阱(如果可以的话).)你可能在文件中有多个END块 - 它们会以与定义相反的顺序执行; 那就是:后进先出(LIFO).使用-c开关运行perl时,或者编译失败时,不会执行END块.

从运营商返回的替换数量s

s/PATTERN/REPLACEMENT/msixpodualngcer

在字符串中搜索模式,如果找到,则用替换文本替换该模式,并返回所做的替换次数.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有