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