como substituir uma expressão sed (alterar e imprimir somente uma linha combinada) com uma expressão perl?

1

Estou tentando migrar para o perl (do sed). Mas como posso substituir essa expressão sed por perl de maneira similar?

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

Eu preciso procurar um padrão, e somente quando o padrão for encontrado, substitua "stuff" por "changed".

A única maneira que eu poderia fazer era com uma declaração if que se parece com isso

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

É possível fazer isso tão curto quanto com sed? Como?

PS: como fazer isso com python aqui

    
por erik 16.07.2015 / 00:12

2 respostas

9

Use o formulário modificador de if :

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

ou, você pode usar and e or para controle de fluxo:

perl -ne '/patternmatch/ and s/stuff/changed/, print'
    
por 16.07.2015 / 00:19
-1

'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
    
por 10.01.2016 / 13:51