perl -ipe 's/$/;/ if /PATTERN/'
Isso adicionará um ; no final se a linha contiver PATTERN .
entradas:
line1 with the PATTERN that contains ( )
line2 with the PATTERN that contains ( )
lineN with the PATTERN that contains ( )
saídas:
line1 with the PATTERN that contains ( ) ;
line2 with the PATTERN that contains ( ) ;
...
lineN with the PATTERN that contains ( ) ;
Eu tentei isso:
find . -name "test.txt" -print | xargs sed -i "/PATTERN/ s/$)/); /g"
mas não funcionou.
perl -ipe 's/$/;/ if /PATTERN/'
Isso adicionará um ; no final se a linha contiver PATTERN .
O $ corresponde ao final da linha, portanto, seu padrão deve ser )$ em vez de $) , como em seu exemplo.
Além disso, você não precisa de xargs aqui, é mais seguro usar o sinal -exec de fine :
find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' +
Se a sua versão do find não funcionar com + no final, use \; (obrigado @ glenn-jackman ):
find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' \;
Por fim, não há necessidade do sinal g em um idioma s/something$// , pois há apenas uma ocorrência de $ por linha.
Assumindo que PATTERN é realmente ( ) e que algo pode estar entre o ( ) e que eles não estão necessariamente no final da linha:
sed -i '/(.*)/ s/$/ ;/' test.txt
Usando ex (que é equivalente a vi -e / vim -e ).
Um arquivo:
ex +"g/local/s/$/;/g" -cwq foo.txt
Todos os arquivos test.txt de forma recursiva:
ex +"bufdo g/local/s/$/;/g" -cxa **/test.txt
Observação: certifique-se de que a opção de globbing ( ** ) é ativado por: shopt -s globstar se o seu shell for compatível.
Observação: o comando :bufdo não é POSIX .
Tente:
sed --in-place '/PATTERN/s/.*/&;/' /path/to/file.txt
Tags sed shell line-editor