2 votes

remplacer un texte par une partie de texte en utilisant regex avec bash perl

Par exemple, j'ai ce résultat :

string1 anynameveryveryverylong string2
string1 othernameveryveryverylong   string2

Je veux tronquer le nom aux dix premiers caractères :

string1 anynamever  string2
string1 othernamev  string2

une pseudo regex peut être :

perl -pe "s/([^\t]+\t)([^\t]+)\t/\1\2{10}\t/g"

Comment puis-je l'obtenir ?

4voto

John O'Brien Points 21
perl -pe 's/^(\S+\s+)(\S{10})\S*/$1$2/'
  • ^ correspond au début de la chaîne
  • \S signifie sans espace blanc
  • + signifie répété au moins une fois
  • \s signifie espace blanc
  • {10} signifie répété 10 fois

C'est-à-dire qu'il faut garder le premier mot et les 10 premiers caractères du mot suivant et oublier les caractères restants du deuxième mot.

Votre pseudo-exemple a un problème substantiel : le {10} est placé dans la partie de remplacement, mais le remplacement est juste une chaîne. L'expression rationnelle est placée dans la partie motif uniquement.

3voto

Stewart Points 1385

D'autres choix :

  1. Perl avec autosplitting sur les tabulations :

    $ perl -F"\t" -lae '$F[1]=substr($F[1],0,10); print join "\t",@F' file 
    string1  anynamever  string2
    string1  othernamev  string2
  2. awk

    $ awk -F"\t" -vOFS="\t" '{$2=substr($2,1,10)}1' file 
    string1  anynamever  string2
    string1  othernamev  string2
  3. sed

    $ sed -E 's/(\S+\t\S{10})[^\t]+/\1/' file 
    string1  anynamever  string2
    string1  othernamev  string2
  4. Un Perl de plus

    $ perl -pe 's/(\S+\t\S{10})[^\t]+/\1/' file 
    string1  anynamever  string2
    string1  othernamev  string2

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