Bem, aqui está uma página da Wikipedia para correspondência ou substituição por Perl one liners . Eu fiz isso em Cygwin :
Perl pode se comportar como grep ou como sed.
O /s
faz o ponto corresponder à nova linha.
O -0777
faz com que ele aplique a expressão regular à coisa toda, em vez de linha por linha.
\n
também pode corresponder à nova linha.
$ echo -e 'a\nb\nc\nd' | perl -0777 -pe 's/.*c//s'
d
user@comp ~
$ echo -e 'a\nb\nc\nd' | perl -pe 's/.*c//s'
a
b
d
Aqui está o outro formulário, -ne
com print $1
:
user@comp ~
$ echo -e 'a\nb\nc\nd' | perl -ne 'print $1 if /(.*c)/s'
c
user@comp ~
$ echo -e 'a\nb\nc\nd' | perl -0777 -ne 'print $1 if /(.*c)/s'
a
b
c
user@comp ~
$
Alguns outros exemplos
$ cat t.t
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
$ perl -0777 -ne 'print $1 if /\<ul\>(.*?)\<\/ul>/s' t.t
<li>item 1</li>
<li>item 2</li>
user@comp ~
$ perl -0777 -ne 'print $1 if /(.*)/s' t.t
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
user@comp ~
$
Um exemplo de Global para o -ne
one (altere "if" para "while"):
$ echo -e 'bbb' | perl -0777 -ne 'print $1 while /(b)/sg'
bbb
Para o -pe
, basta adicionar o g
no final ( /sg
ou /gs
, mesma coisa):
$ echo -e 'aaa' | perl -0777 -pe 's/a/z/s'
zaa
user@comp ~
$ echo -e 'aaa' | perl -0777 -pe 's/a/z/sg'
zzz
Observação- Esta questão contrasta / s e -0777