J'ai le fichier "test.txt" qui contient :
Val1 = '59'
Val2 = '76'
Val3 = '42'
Val4 = '53'
Je avec cette commande :
perl -pe "s/^Val2 = '(.*)'/\1/" test.txt
Je veux :
76
Mais j'obtiens :
Val1 = '59'
76
Val3 = '42'
Val4 = '53'
J'ai le fichier "test.txt" qui contient :
Val1 = '59'
Val2 = '76'
Val3 = '42'
Val4 = '53'
Je avec cette commande :
perl -pe "s/^Val2 = '(.*)'/\1/" test.txt
Je veux :
76
Mais j'obtiens :
Val1 = '59'
76
Val3 = '42'
Val4 = '53'
La balise -p
est comme l'impression par défaut de sed - également comme sed, si vous voulez supprimer l'impression par défaut, vous utiliseriez plutôt -n
.
Donc vous pourriez faire
perl -ne "print if s/^Val2 = '(.*)'/\1/" test.txt
Vous pourriez également utiliser une correspondance de regex match plutôt qu'une regex substitution:
perl -lne "print \$1 if /^Val2 = '(.*)'/" test.txt
ou
perl -nE "say \$1 if /^Val2 = '(.*)'/" test.txt
(le backslash sert à protéger $1
d'être étendu par le shell, puisque l'expression est entre guillemets pour permettre l'utilisation de guillemets simples littéraux dans la correspondance).
Utilisez cette commande Perl en une seule ligne :
perl -lne "print for /^Val2\s+=\s+'(.*)'/" test.txt
Elle est légèrement plus courte et il n'est pas nécessaire d'échapper à des variables, car la boucle for
transmet implicitement le groupe capturé (.*)
à print
en tant $_
, qui est l'argument par défaut de print
.
Elle utilise également "\s+
" (1 ou plusieurs caractères d'espace) au lieu de " " (1 espace) pour être moins strict sur l'entrée qu'elle accepte. Bien que facultatif, je préfère suivre la règle consistant à être moins strict sur l'entrée et plus strict sur la sortie (je ne suis pas sûr de la source de cette règle, cependant).
La commande Perl en une seule ligne utilise les options suivantes en ligne de commande :-e
: Indique à Perl d'exécuter le code en ligne, plutôt que dans un fichier.-n
: Parcourir l'entrée ligne par ligne, en l'assignant par défaut à $_
.-l
: Supprime le séparateur de ligne de l'entrée ("\n"
par défaut sur *NIX) avant d'exécuter le code en ligne, et l'ajoute lors de l'impression.
VOIR AUSSI:perldoc perlrun
: comment exécuter l'interpréteur Perl : options de ligne de commandeperldoc perlre
: expressions régulières Perl (regex)perldoc perlre
: expressions régulières Perl (regex) : Quantificateurs; Classes de caractères et autres échappements spéciaux; Assertions; Groupes de captureperldoc perlrequick
: démarrage rapide des expressions régulières Perl
SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.