Resposta
perl -0777 -p -i -e 's/,(\n*)\Z//m' *.txt
removerá o último ',' em todos os arquivos que terminem em .txt
, se o ',' for seguido apenas por 0 ou mais caracteres de nova linha e depois pelo final do arquivo.
Do seu exemplo:
reedm@www:~/tmp $ cat > test.txt
blah blah blah,
blah blah blah,
blah blah blah,
reedm@www:~/tmp $ perl -0777 -p -i -e 's/,(\n*)\Z//m' *.txt
reedm@www:~/tmp $ cat test.txt
blah blah blah,
blah blah blah,
blah blah blah
reedm@www:~/tmp $
Wat?
Perl é um animal esotérico na melhor das hipóteses, e perl one-liners pode ser particularmente enigmático. O sinalizador -e
nos permite passar um programa perl na linha de comando. Neste caso, o 's / regex / substituir / sinalizadores' é o programa.
O -p
flag faz com que o perl aplique seu programa fornecido em um loop sobre cada "linha" (veja -0
) para cada nome de arquivo fornecido.
O -i
flag faz com que o perl substitua o arquivo pela saída do programa, em vez de imprimir a saída como saída padrão.
O sinalizador -0
altera o que o delimitador perl usa para dividir um arquivo em "linhas". 0777
é um valor especial, usado por convenção para fazer o perl ler todo o arquivo em uma única "linha".
A expressão regular é um pouco complicada pelo uso de alguns truques específicos de perl:
- Primeiro, o sinalizador
m
no final faz com que o regex funcione várias linhas. -
,
é simples e corresponde a uma única vírgula literal. -
(\n*)
corresponde a 0 ou mais linhas novas em uma linha e as armazena como subpadrão (os caracteres(
e)
denotam um subpadrão). Como isso é o primeiro subpadrão, podemos usarna seção de substituição para significar "qualquer que seja este subpadrão combinado".
-
\Z
é uma extensão específica do perl e corresponde ao final da string sendo trabalhado com - neste caso, esse é o arquivo inteiro. - Na peça de substituição, usamos
para substituir a correspondência apenas a série de novas linhas, removendo a vírgula.
Para informações de homem sobre expressões regulares perl e sinalizadores de linha de comando perl, confira as man pages para perlre
e perlrun
, respectivamente.