С оболочками с csh
-, такими как раскрытие скобок (csh, tcsh, zsh, bash, pdksh, ksh93, yash -o braceexpand
, fish
), вы можете сделать:
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'{7,6,5}
1 2 3 4 5x6x7x8 9
Расширение фигурной скобки расширяет это до
sed '-es/ /x/'7 '-es/ /x/'6 '-es/ /x/'5
Мы делаем это в обратном порядке, чтобы одна замена не влияла на следующую.
Вы можете сделать это диапазоном с формой {x..y}
из zsh
(, теперь также поддерживаемой bash, ksh93,yash -o braceexpand
)
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'{7..3}
1 2 3x4x5x6x7x8 9
или комбинации обеих форм:
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'{{7..3},1}
1x2 3x4x5x6x7x8 9
С помощью zsh
вы можете поместить их в массив:
$ substs=({7..5} 3 1)
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'$^substs
1x2 3x4 5x6x7x8 9
И пусть zsh
отсортирует их в правильном обратном числовом порядке:
$ 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
С помощью zsh
или bash
вы также можете выполнить:
$ substs=({7..5} 3 1)
$ echo 1 2 3 4 5 6 7 8 9 | sed "${substs[@]/#/-es: :x:}"
1x2 3x4 5x6x7x8 9
Сfish
(и GNU seq
),вы можете делать такие вещи, как:
$ echo 1 2 3 4 5 6 7 8 9 | sed '-es/ /x/'(seq 6 -1 3)
1 2 3x4x5x6x7 8 9
Или:
$ 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
расширяются, как в rc
или zsh -o rcexpandparam
в данном примере ).
С помощью perl
вы можете сделать что-то вроде:
$ 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