Return sólo coincide de sustitución en Perl 5.8.8 (era: Perl “p” regex modificador equivalente)

StackOverflow https://stackoverflow.com/questions/4438120

  •  09-10-2019
  •  | 
  •  

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.

¿Fue útil?

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top