`sed`は各行の5番目と7番目のスペースを単一の `s / `代替コマンドに置き換えることができますか?

`sed`は各行の5番目と7番目のスペースを単一の `s / `代替コマンドに置き換えることができますか?

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配列はこの例やこの例のように拡張されますrczsh -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が負の場合、または$#より大きくない場合は成功を返します。

関連情報