Return sólo coincide de sustitución en Perl 5.8.8 (era: Perl “p” regex modificador equivalente)
Pregunta
Tengo un guión ( fuente ) a svn info
de análisis para crear una cadena adecuada para $PS1
de Bash. Por desgracia, esto no funciona en un sistema que estoy usando que se está ejecutando Perl 5.8.8 - Genera todas las líneas en lugar de sólo los partidos. ¿Cuál sería el Perl 5.8.8 equivalente a la siguiente?
__svn_ps1()
{
local result=$(
svn info 2>/dev/null | \
perl -pe 's;^URL: .*?/((trunk)|(branches|tags)/([^/]*)).*;\2\4 ;p')
if [ -n "$result" ]
then
printf "${1:- (%s)}" $result
fi
}
La salida de Perl 5.10 contiene sólo un espacio, entre paréntesis, una de nombre de la sucursal, nombre de la etiqueta o trunk
, y el paréntesis final. La salida de Perl 5.8.8 (sin el p
final) contiene este plus una versión entre paréntesis de cada parte separada por espacios de la salida svn info
.
Una posible solución consiste en un grep '^URL: '
simple entre los comandos y svn
perl
, pero yo tenía la esperanza de evitar que desde este se ejecutará para cada indicador bash.
Solución
Si sólo desea la salida de una línea que partidos, no utilizan el interruptor -p
de línea de comandos. Se imprime el valor de $_
en el extremo de cada bucle. Es posible que desee algo con el interruptor -n
de línea de comandos:
perl -ne 'print if s/.../.../'
Yo lo haría de la misma manera para Perl v5.8 y v5.10. No estoy seguro de lo que usted piensa que el modificador /p
está haciendo ya que no utiliza los $`
, $&
, o variables $'
o sus equivalentes por cada partido.
Se puede leer acerca de la línea de comandos en perlrun .
Otros consejos
Como de Perl 5.10, el interruptor /p
dice Perl para poner contenido coincidente en ${^PREMATCH}
, ${^MATCH}
y ${^POSTMATCH}
.
Y el de una sola línea que has enviado nunca utiliza los Vars, por lo que omiten el /p
.
ACTUALIZACIÓN: Tratar de mantenerse al día con la pregunta inicial ...
perl -ne 's/search/replace/ and print'
sólo se imprimirá líneas para las que se realizó la sustitución. Nota -n
frente interruptor -p
. Además, he probado el -p
combinado /p
en mi 5.10 y felizmente imprime líneas no coincidentes inalteradas también. Tal vez me haya perdido algo ...