Заменить диапазон токенов в строке - PullRequest
3 голосов
/ 24 декабря 2011

У меня есть следующая строка:

this and this and this and this and this and this

, и я хочу в верхнем регистре с 3 по 5 вхождение токена this:

this and this and THIS and THIS and THIS and this

Строка не содержит*. переводы строк 1008 *

Ответы [ 7 ]

3 голосов
/ 24 декабря 2011

Perl

Используйте модификатор /e:

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

Как однострочник:

perl -pi.bak -E 's/this/ 3 <= ++$c && $c <= 5 ? THIS : this/eg' file
3 голосов
/ 24 декабря 2011

Это довольно короткий однострочный с sed

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

Выход

$ 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
3 голосов
/ 24 декабря 2011
#!/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";

Тогда:

$ 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
2 голосов
/ 24 декабря 2011

только эхо patten 3 раза: (аналогично решению SiegeX)

$ 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
0 голосов
/ 24 декабря 2011

Это может работать для меня:

echo "this and this and this and this and this and this" | 
sed 's/this/&\n/6g;s/this[^\n]/\U&/3g;s/\n//g'
this and this and THIS and THIS and THIS and this

Пояснение:

С 3 по 5 вхождение строки объекта может упоминаться как m'th до n'th

  1. Добавить новую строку (или любой символ, отсутствующий в строке) к строке объекта из m'th+1 глобально.
  2. Изменение или замена строки объекта из вхождения n'th во всем мире.
  3. Удалите все новые строки, восстановив, таким образом, исходные строки объекта

В этом примере это тоже работает:

sed 's/this/\U&/3ig;s//\L&/6g'

Как это сделать:

sed ':a;s/this/\U&/3;s/^/\n/;/^\n\{3\}/!ba;s///'
0 голосов
/ 24 декабря 2011

Вы можете сделать что-то вроде этого ...

my @str = split(/\s+/,$string);

$str[4] = uc($str[4]); # Uppercase fifth element...
.
.                      # Repeat here for each element you want...
.

$string = join(' ',@str);
0 голосов
/ 24 декабря 2011
awk '{for(x=1;x<=NF;x++)if($x~/this/){i++;if(i>=3&&i<=5) $x=toupper($x)}}1' yourFile

тест на вашем примере:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...