Como adicionar texto ao final da linha quando o padrão é correspondido?

8

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.

    
por user3342338 28.02.2014 / 23:03

5 respostas

3

perl -ipe 's/$/;/ if /PATTERN/'

Isso adicionará um ; no final se a linha contiver PATTERN .

    
por 28.02.2014 / 23:11
3

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.

    
por 28.02.2014 / 23:14
2

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
    
por 28.02.2014 / 23:15
1

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 .

    
por 25.05.2015 / 14:55
0

Tente:

sed --in-place '/PATTERN/s/.*/&;/' /path/to/file.txt
    
por 28.02.2014 / 23:05