's/abc/xyz/'

's/abc/xyz/'

我正在尝试从 sed 转向 perl。但是我怎样才能以类似的简短方式用 perl 替换这个 sed 表达式呢?

sed -n '/patternmatch/s%stuff%changed%p' file

我需要搜索一个模式,并且只有当找到该模式时,才用“已更改”替换“东西”。

我能做到的唯一方法是使用 if 语句,如下所示

perl -ne 'if ( /patternmatch/ ) { s%stuff%changed%; print }' file

是否可以像 sed 一样短?如何?

PS:如何做到这一点python这里。

答案1

使用修饰符形式if

perl -ne 's/stuff/changed/, print if /patternmatch/'

或者,您可以使用andor进行流量控制:

perl -ne '/patternmatch/ and s/stuff/changed/, print'

答案2

's/abc/xyz/'

user@unix:~$ echo 'abc' | sed      's/abc/xyz/'
xyz   

user@unix:~$ echo 'abc' | perl -pe 's/abc/xyz/'
xyz

user@unix:~$ echo 'abc' > file.txt && cat file.txt
abc

user@unix:~$ sed      's/abc/xyz/' file.txt
xyz   

user@unix:~$ perl -pe 's/abc/xyz/' file.txt
xyz

's/patternmatch/stuffchanged/'

user@unix:~$ echo 'patternmatch' | sed      's/patternmatch/stuffchanged/'
stuffchanged   

user@unix:~$ echo 'patternmatch' | perl -pe 's/patternmatch/stuffchanged/'
stuffchanged

user@unix:~$ echo 'patternmatch' > file.txt && cat file.txt
patternmatch

user@unix:~$ sed      's/patternmatch/stuffchanged/' file.txt
stuffchanged   

user@unix:~$ perl -pe 's/patternmatch/stuffchanged/' file.txt
stuffchanged

相关内容