pt: substitua o texto por uma string que contenha caracteres especiais

4

Eu tenho um monte de arquivos de texto com uma tag específica chamada "Comment", exemplo Eu tenho um arquivo chamado 3dchess.sh,

Eu preciso mudar a tag:

Comment=3D chess for X11 

para

Comment='<span size="xx-large">3D chess for X11</b>'

O script é:

#!/bin/sh
Package=3dchess
Popcon=48
Section=universe

Comment=3D chess for X11
Exec=3Dc

Eu tentei isso, mas não funciona no meu caso:

sed -i ':Comment=:s:Comment=:Comment='<span size="xx-large">:g;/Comment=/s/$/</b>'/' $HOME/3dchess.sh
    
por davidva 27.02.2014 / 00:19

2 respostas

7

Pessoalmente, gosto da opção -r de sed que permite expressões regulares estendidas, para que os parênteses não precisem ser ignorados:

sed -r "s#(Comment=)(.*)#'<span size=\"xx-large\"></b>'#" 3dchess.sh 

Observe que, como você deseja usar ' na substituição, não é possível usar sed 's///' , mas precisa usar sed "s///" . Além disso, como você precisa ter / como parte do padrão, não é possível usá-lo como um delimitador, portanto, é necessário escolher outro caractere. Eu escolhi # , mas você pode usar o que quiser. Como disse Graeme, quando você tiver certeza de que isso funciona bem, adicione a opção -i para editá-lo.

    
por 27.02.2014 / 01:21
4
sed 's:^Comment=\(.*$\):Comment='\''<span size="xx-large"></b>'\': \
  $HOME/3dchess.sh

Adicione -i quando tiver certeza de que você tem o que deseja.

Divisão:

s:x:y: - Este é o padrão geral de substituição, basicamente substitua x por y . Obviamente, temos muito mais entre os dois pontos acima! Geralmente, : é / , mas sed recebe o que vier depois do s e usar / aqui significaria que você precisa escapar do padrão.

^Comment= - correspondência de regex Comment= no início de uma linha ( ^ ). Boa prática, pois é possível (embora improvável) conseguir isso em outro lugar, o que causaria problemas.

\(.*$\) - corresponde a qualquer coisa ( .* ) até o final da linha ( $ ). Envolvendo com \( \) cria uma referência posterior para uso posterior.

'\'' - feche as cotas '' , coloque um literal ' e reabra as cotações. Método alternativo para @ terdon's.

Comment=<span size="xx-large"></b> - string de substituição, é a referência anterior de antes.

'\': - feche aspas, coloque um literal ' e depois os dois pontos finais.

    
por 27.02.2014 / 00:25