2011-06-08 17 views
5

Necesito reemplazar un poco de texto en varios archivos CSS, pero solo en la primera ocurrencia.Reemplazar solo la primera coincidencia en varios archivos con Perl

He intentado sustituir con:

perl -pi -e 's/(width:).*;/$1 100%;/' filename.css 

Pero esto reemplaza el valor después de cada ocurrencia de 'ancho:' en el archivo, a pesar de que no estoy usando el modificador/g. Estoy ejecutando esto en una máquina Ubuntu reciente.

Respuesta

3

puede detener el reemplazo después de la primera:

perl -pi -e '$a=1 if(!$a && s/(width:).*;/$1 100%;/);' filename.css 
+2

O, más corto: '... -e '! $ x && s/.../.../&& ($ x = 1) ''. Además, esto solo funciona si solo hay un archivo en la pregunta. Desafortunadamente no funciona para múltiples archivos. – musiKk

+0

este funciona para mí, gracias! –

+0

@musikk, por eso contribuí con mi respuesta, que funcionaría para múltiples archivos. – Axeman

0

Puede probar esto:

perl -pi -e 's/(width:).*;/$a?$&:++$a&&"$1 100%;"/e' filename.css 
0

Tal s/(width:).*;/$1 100%;/o haría?

6

Nadie ha abordado una implicación de su pregunta real sobre el título. Recomiendo el mismo enfoque que se usa aquí, única modificación:

perl -pie '!$subbed{$ARGV} and s/(width:).*;/$1 100%;/ and $subbed{$ARGV}++' *.css 

La ONU-dimensionada $ARGV es el name of the current file. Por lo tanto, para cada archivo, está reemplazando solo la primera vez. El "glob" *.css enviará múltiples archivos. Si hace el cambio escalar que otras personas están sugiriendo, solo modificará la primera ocurrencia en el primer archivo con ese patrón. (Aunque, tal vez eso es lo que desea.)

+0

Buena solución. No sabía que '$ ARGV' contiene el nombre del archivo actual. – musiKk

+0

@musiKk, http://perldoc.perl.org/perlvar.html#$ARGV – Axeman

+0

Sí, gracias. Lo encontré. :) – musiKk

4

Si lee en modo párrafo, cada archivo es solo una línea; por lo tanto, s /// sin el modificador/g reemplazará la primera instancia en cada archivo, luego pasará al siguiente archivo:

perl -0777 -pi -e's/(width:).*;/$1 100%;/' *.css 
Cuestiones relacionadas