Com shells com csh
- como expansão de contraventamento (csh, tcsh, zsh, bash, pdksh, ksh93, yash -o braceexpand
, fish
), você poderia fazer:
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'{7,6,5}
1 2 3 4 5x6x7x8 9
A expansão da chave expande isso para
sed '-es/ /x/'7 '-es/ /x/'6 '-es/ /x/'5
Estamos fazendo isso de forma que uma substituição não influencie a próxima.
Você pode torná-lo um intervalo com o formulário {x..y}
de zsh
(agora também suportado por bash, ksh93, yash -o braceexpand
)
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'{7..3}
1 2 3x4x5x6x7x8 9
ou combinações de ambas as formas:
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'{{7..3},1}
1x2 3x4x5x6x7x8 9
Com zsh
, você pode colocá-los em uma matriz:
$ substs=({7..5} 3 1)
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'$^substs
1x2 3x4 5x6x7x8 9
E tenha zsh
ordenando-os na ordem numérica inversa correta:
$ substs=(1 8 6)
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'${(On)^substs}
1x2 3 4 5 6x7 8x9
Com zsh
ou bash
, você também pode fazer:
$ substs=({7..5} 3 1)
$ echo 1 2 3 4 5 6 7 8 9 | sed "${substs[@]/#/-es: :x:}"
1x2 3x4 5x6x7x8 9
Com fish
(e GNU seq
), você pode fazer coisas como:
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'(seq 6 -1 3)
1 2 3x4x5x6x7 8 9
Ou:
$ set substs 5 3 1
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'$substs
1x2 3x4 5x6 7 8 9
( fish
arrays expandem como em rc
ou zsh -o rcexpandparam
neste exemplo).
Com perl
, você pode fazer algo como:
$ echo 1 2 3 4 5 6 7 8 9 | perl -pe 'BEGIN{$h{$_}=1 for (3,5..8)}
my $n; s/ /$h{++$n} ? "x" : $&/ge'
1 2 3x4 5x6x7x8x9