5 番目と 7 番目のスペースのみを次に置き換えることができます。
$ echo "1 2 3 4 5 6 7 8" | sed 's/\ /x/5;s/\ /x/6'
1 2 3 4 5x6 7x8
ただし、sed
サポートリストと範囲がある可能性があります。Ns/
セミコロンで区切られた2つの代替ではなく、1つの置換のみを使用してパターンが発生しますか?
$ echo "1 2 3 4 5 6 7 8" | sed 's/\ /x/5,7'
sed: -e expression #1, char 9: unknown option to `s'
答え1
中かっこ拡張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
1 つの置換が次の置換に影響しないように戻る。
{x..y}
from形式を使用して範囲に設定できます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
または2つの形式の組み合わせ:
$ 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
答え2
$ echo $SHELL
/bin/bash
$ set -- 6 7 # or bash -s 6 7 (set positional parameters)
$ echo "1 2 3 4 5 6 7 8" | sed "s/ /x/$1"
1 2 3 4 5 6x7 8
$ shift # ¹
$ echo "1 2 3 4 5 6 7 8" | sed "s/ /x/$1"
1 2 3 4 5 6 7x8
1:
$ help Shift
Shift:Shift [n]
Shift位置パラメータ。位置パラメータ $N+1,$N+2... の名前を $1,$2... に変更します。 N が指定されない場合は 1 とみなされます。
終了ステータス:Nが負の場合、または$#より大きくない場合は成功を返します。