3 votes

Remplacer une plage de jetons dans une chaîne

J'ai la chaîne suivante :

this and this and this and this and this and this

et je veux mettre en majuscule la 3ème à la 5ème occurrence du jeton this:

this and this and THIS and THIS and THIS and this

La chaîne ne contient pas de sauts de ligne.

3voto

Alex Reynolds Points 45039
#!/usr/bin/perl -w

use strict;
use warnings;

my $delimiter = " and ";
my $inputLine = <>;
chomp $inputLine;
my @thises = split($delimiter, $inputLine);
my $thisIdx = 0;
my @results;
foreach my $this (@thises) {
  if (($thisIdx >= 2) && ($thisIdx <= 4)) {
    push @results, uc($this);
  }
  else {
    push @results, $this;
  }
  $thisIdx++;
}
print STDOUT join($delimiter, @results)."\n";

Ensuite:

$ echo "this and this and this and this and this and this" | ./test.pl
this and this and THIS and THIS and THIS and this

3voto

SiegeX Points 32614

Ceci est une courte ligne avec sed

sed '/this/{s//\U&/3;s//\U&/3;s//\U&/3;}'

Sortie

$ echo "this and this and this and this and this and this" | sed '/this/{s//\U&/3;s//\U&/3;s//\U&/3;}'
this and this and THIS and THIS and THIS and this

3voto

Zaid Points 21192

Perl

Utilisez le modificateur /e:

my $count;
$str =~ s{this}{ 3 <= ++$count && $count <= 5 ? THIS : this }eg;

Comme une seule ligne:

perl -pi.bak -E 's/this/ 3 <= ++$c && $c <= 5 ? THIS : this/eg' file

2voto

kev Points 41855

just echo patten 3 times:(same as SiegeX's solution)

$ echo "this and this and this and this and this and this" | sed "/this/{`echo 's//\U&/3;'{,,}`}"
this and this and THIS and THIS and THIS and this

0voto

Kent Points 71470
awk '{for(x=1;x<=NF;x++)if($x~/this/){i++;if(i>=3&&i<=5) $x=toupper($x)}}1' votreFichier

test avec votre exemple:

kent$  echo "this and this and this and this and this and this"|awk '{for(x=1;x<=NF;x++)if($x~/this/){i++;if(i>=3&&i<=5) $x=toupper($x)}}1'
this and this and THIS and THIS and THIS and this

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X