3 votes

Bash --> commande perl: imprimer uniquement le texte remplacé

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'

6voto

steeldriver Points 118154

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

2voto

Timur Shtatland Points 165

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 commande
perldoc 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 capture
perldoc perlrequick : démarrage rapide des expressions régulières Perl

SistemesEz.com

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.

Powered by:

X