Como posso encontrar e substituir a primeira frase em vários arquivos que contenham a frase várias vezes?

3

Eu quero mudar a primeira cor de fundo seguindo o

body {

estilo do que quer que seja para

background-color: #000000;

em sete arquivos stylesheets.css diferentes via linha de comando. Além disso, cada arquivo .css contém mais de 10 instâncias, e é por isso que só quero alterar a que segue o código do estilo body { .

    
por Serge 16.12.2012 / 08:36

3 respostas

2

Faça algumas alterações de acordo com o seu arquivo:

sed  '0,/body{background-color:.*;/s//body{background-color:#000000;/' sample.css

ou faça isso rapidamente:

sed  '0,/body{background-color:.*;/s//body{background-color:#000000;/' *.css    
sed ':a;N;s/\n/\a/;$!ba;s/body[ \t\a]*{[ \t\a]*background-color:#[0-9a-zA-Z]*;/body\n{background-color:#000000;/;s/\a/\n/g;' *.css

Fonte: The sed FAQ

    
por yuan 16.12.2012 / 09:50
2

Geralmente, você precisa de uma boa expressão regular que corresponda às suas necessidades. sed é uma boa ferramenta para usar, perl é outra. A única razão pela qual estou preferindo perl é que conheço melhor sua sintaxe de expressão regular. A seguinte linha deve fazer o que você quer:

perl -0777 -i.bak -pe 's/(body {.*?background-color.*?)#.{6}/#000000/si;' ./style.css

-0777 significa dividir em nada, portanto, sorve todo o arquivo (em vez de linha por linha, o padrão para -p)

-i.bak significa alterar os arquivos no lugar, deixando o original com extensão .bak (o padrão para -p é apenas imprimir)

-p significa passar linha por linha (exceto nós estamos sugando) para o código passado (veja -e)

-e espera que o código seja executado.

Explicar a expressão regular está além do escopo da minha resposta, mas há muitos tutoriais por aí como este por exemplo.

Certifique-se de verificar os resultados, pois posso facilmente imaginar arquivos css que causariam problemas com essa expressão. Por exemplo, ter seletores que contenham a palavra corpo podem causar problemas ...

    
por Andy Friese 16.12.2012 / 10:41
1

Eu tentaria por awk :

gawk -v RS='}[[:space:]]*' '/^body[[:space:]]*{/ { 
  printf "%s%s", gensub (/background-color:[^;]*;/, "background-color: #000000;", 1), RT
}'

Isso requer o GNU awk (mas pode ser feito sem ele também).

  • Nós definimos o separador de registro como } seguido por qualquer quantidade de espaço em branco.
  • Em seguida, podemos corresponder body { ao início do registro.
  • E substitua background-color: #000000; pela primeira instância de background-color . Substitua 1 por g para corresponder a todas as instâncias.
  • RT contém o texto correspondido pelo separador de registro. Se usássemos uma string fixa ( } ) em vez de uma expressão regular, poderíamos usar ORS . RT precisa do GNU awk.
  • O GNU awk também tem uma edição no local plugin . Use gawk -i inplace ...

Na verdade, isso não é um trabalho para expressões regulares ou analisadores de registros. Algo que entenda a linguagem CSS deve ser usado.

    
por muru 06.01.2015 / 08:06