2010-01-18 8 views
1

Tout d'abord désolé pour mon mauvais anglais. Je suis un mec allemand.PCRE regex à sed regex

Le code ci-dessous fonctionne très bien en PHP:

$string = preg_replace('/href="(.*?)(\.|\,)"/i','href="$1"',$string); 

maintenant T besoin de la même chose pour sed. Je pensais que ce devrait être:

sed 's/href="(.*?)(\.|\,)"/href="{$\1}"/g' test.htm 

Mais cela me donne cette erreur:

sed: -e expression #1, char 36: invalid reference \1 on `s' command's RHS

+0

Qu'essayez-vous de faire avec cette regex? –

+0

Pouvez-vous clarifier ce que vous essayez d'apparier et de remplacer? Je ne connais pas les expressions rationnelles PHP aussi bien que les Linux. – Chowlett

+0

PHP utilise Perl Compatible Regular Expression (PCRE). –

Répondre

1
sed -e 's|href=\"\(.[^"][^>]*\)\([.,]\)\">|href="\1">|g' file 
+0

c'est tout. Je vous remercie – Seblon

2

Vous avez besoin d'une barre oblique inverse devant la parenthèse que vous souhaitez référencer, ainsi

sed 's/href="\(.*?\)(.|\,)"/href="{$\1}"/g' test.htm 
+0

ne fonctionne pas :(devrait remplacer. et, à la fin d'une url – Seblon

+1

vous n'avez pas dit ce que vous voulez faire, juste que l'expression rationnelle a échoué :) – user231967

0

Vous doivent échapper les caractères de sélection de bloc ( et ) comme suit.

sed 's/href="\(.*?\)\(.|\,\)"/href="{$\1}"/g' test.htm 
3

sed ne supporte pas la correspondance regex non gourmande.

+0

S'il vous plaît élaborer sur ce sujet. –

+1

\ (. *? \) <--- ceci est une correspondance gourmande (avec le point d'interrogation "?") – ghostdog74

+0

Donc, si sed ne supporte pas la correspondance non-gourmande, elle devrait supporter le match glouton - Qu'est-ce qui me manque? –

0

Si vous voulez faire correspondre un "." Littéral, vous devez l'échapper ou l'utiliser dans une classe de caractères. Au lieu de réduire les parenthèses de capture (ce que vous devez faire avec les RE de base), vous pouvez utiliser l'option -E pour indiquer à sed d'utiliser des RE étendues. Enfin, les RE utilisés par sed utilisent \N pour désigner les sous-modèles, où N est un chiffre.

sed -E "s/href=([\"'])([^\"']*)[.,]\1/href=\1\2\1/i" 

Ceci a son propre problème qui empêchera les correspondances des attributs href qui utilisent les deux types de guillemets.

man sed et man re_format donnera plus d'informations sur les RE utilisés dans sed.

+1

Dans ma version de sed, il utilise '-r' pour spécifier des expressions régulières étendues (qui ne nécessitent pas de parenthèse d'échappement) au lieu de' -E'. – tomlogic

0

ici est une solution, il est préfet, seul face à la situation d'un extra « » ou « »


sed -r -e 's/href="([^"]*)([.,]+)"/href="\1"/g' test.htm