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.

user3342338
fonte

Respostas:

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

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

michas
fonte
3

A $corresponde ao fim da linha, de modo que o seu padrão deve ser )$, em vez de $), como no seu exemplo.

Além disso, você não precisa xargsaqui, é mais seguro usar a -execbandeira de fine:

find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' +

Se a sua versão do find não funcionar +no final, use-o \;(obrigado @ glenn-jackman ):

find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' \;

Por fim, não há necessidade do gsinalizador em um s/something$//idioma, pois há apenas uma ocorrência de $por linha.

janos
fonte
1
Você ganhará alguma eficiência com, em -exec ... +vez de -exec ... \;, se sua descoberta permitir.
Glenn Jackman
2

Supondo que PATTERNseja realmente ( )e que algo possa estar entre o ( )e que eles não estejam necessariamente no final da linha:

sed -i '/(.*)/ s/$/ ;/' test.txt
Graeme
fonte
1

Usando ex(que é equivalente a vi -e/ vim -e).

Um arquivo:

ex +"g/local/s/$/;/g" -cwq foo.txt

Todos os test.txtarquivos recursivamente:

ex +"bufdo g/local/s/$/;/g" -cxa **/test.txt

Nota: Certifique-se de que a opção globbing ( **) esteja ativada por: shopt -s globstarse seu shell a suportar.

Nota: O :bufdocomando não é POSIX .

kenorb
fonte
nota bufdo não é POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Steven Penny
0

Tentar:

sed --in-place '/PATTERN/s/.*/&;/' /path/to/file.txt
DopeGhoti
fonte