2009-08-31 3 views
1

Comment pouvez-vous convertir les correspondances suivantes au résultat donné?Comment puis-je réorganiser l'ordre des éléments dans ce modèle, en utilisant Perl?

Mes fichiers ont les matches suivants

-- cut -- 
Lorem ipsun Hello lorem ipsun { $hello } 
@param integer $question_id     // example of the match 
Lorem ipsun Hello lorem ipsun { $hello } 
-- cut -- 

Je voudrais les changer efficacement à

@param $question_id integer 

Ma tentative de pseudo-code

perl -i.bak -pe `s/(@param) (\\w) ($\\w)/$1 $3 $2/` 
+1

se trouve le @ -sign dans le texte pour un paramètre que vous remplissez ou pour la chaîne "@param", même question avec $ -sign par $ question-id –

+0

@Commusoft: @param est un signe dans la question de même que $ dans $ question_id – hhh

Répondre

5

Vous voulez dire (En supposant bash shell):

perl -i.bak -pe 's/(\@param) (\w+) (\$\w+)/$1 $3 $2/' 
+0

Merci beaucoup! Vous venez de me sauver un jour de production :) – hhh

1
s/(\@param)\s+(\w+)\s+(\$\w+)/$1 $3 $2/g 
2

je ne serais probablement aller soit très générique:

perl -i.bak -pe 's/^(\@param)(\s+)(\S+)(\s+)(\S+)/$1$2$5$4$3/' 

ou très spécifique:

perl -i.bak -pe 's/^(\@param)(\s+)(\$[_a-zA-Z]\w*)(\s+)(integer|long|char)(\s+)$/$1$2$5$4$3$6/' 

en fonction des données. Les choses à surveiller sont l'interpolation de chaîne de $ identifiant dans le shell et les interpolations de chaînes de @param et $identifier en Perl. Le premier est géré en utilisant des guillemets simples sur le shell (pour empêcher l'interpolation) et le second est géré en échappant au @ et au $ (ou en utilisant une classe de caractères qui évite d'avoir à correspondre explicitement au $).

Questions connexes