sed代替式(インデントされたテキスト)で数量子を使用する方法は?

sed代替式(インデントされたテキスト)で数量子を使用する方法は?

私は| sed特定のコマンドの結果をインデントするために使用します(簡単な例を挙げます$ echo something)。結果の前にスペース10個を追加したいと思います。以下はうまくいきます。

$ echo something | sed 's/^/         /'
         something

| sedしかし、式に数量子を使用する方法はありますか?

私は例えば試しました。

$ echo something | sed 's/^/ {10}/'
 {10}something

しかし、明らかにこれはうまくいきません。{10}数量子として解釈されません。

バックスラッシュで中括弧を保護することも機能しません。

$ echo something | sed 's/^/ \{10\}/'
 {10}something

代替式に数量子を使用する方法はありますか?

答え1

置換の置換がsed正規表現ではないので、これは可能ではないと思います。

別の方法は、次のように変数を生成して代替変数として使用することです。

# use printf to set as many spaces as you want
$ i=$(printf "%10s")

# use the created variable as replacement of the substitution
$ echo something | sed "s/^/$i/"
          something

答え2

良い解決策がたくさんあります。特に@nezabudkaの| pr -T -o10解決策は非常に短いです。

今、私は楽しんで「sed唯一の」解決策を見つけました(no printf、no expand、何もありません)。

$ echo something | sed ':L; /^ \{10\}/! {s/^/ /;b L}'
          something

編集する:@Barmarの要求に応じて、いくつかの説明は次のとおりです。

  • :L;名前付きタグを作成しますL(必要に応じて名前を付けることができます)。
  • 行の先頭にスペースを追加しますs/^/ /。その後、ラベルに戻ります(b LbラベルでL少しa goto)。
  • /^ \{10\}/!この式を条件付きにします。行が10個の空白()で始まらない場合にのみ実行されます。

したがって、デフォルトでは、行が10個のスペースで始まるまで、「行の先頭にスペースを追加」を繰り返します。

@nezabudkaのpr解決策は明らかに行の前にスペースを追加する最も簡単な方法ですが、このsed解決策はより一般的です。たとえば、XYZ-行の前に5回追加します。

$ echo something | sed ':L; /^\(XYZ-\)\{5\}/! {s/^/XYZ-/;b L}'
XYZ-XYZ-XYZ-XYZ-XYZ-something

答え3

Perlの最高の機能のいくつかはsedから盗まれたので、類似点が役に立つかもしれません。この場合、Perlソリューションはより簡単です。おそらくこのように考えると、sedソリューションが明らかになるかもしれません。あなたが望むのは10個のスペースを印刷することです。それから行を変換して結果を印刷するのではなく、出力を印刷します。

echo something | perl -pe 'print " " x 10'

このフラグはコマンドの最後に-p暗黙的に追加されます。print $_

本当に正規表現を使用したい場合は、この/eフラグを使用してください

echo something | perl -pe 's/^/" " x 10/e'

交換を次のように実行します。実行文結果をサブ値として使用します。 (この場合、以下を使用して10を取得します)反復演算子x

答え4

シェルに10個の空白シーケンスを作成させることができます。

たとえば、次のようになりますzsh

$ echo something | sed "s/^/${(l[10])}/"
          something

ここで、lパラメータ拡張フラグは、eftパディングを使用した空のパラメータ拡張に適用されます。rここで右側にあるものを使用することもできます。さまざまな文字で埋める:

$ echo something | sed "s/^/${(l[10][.])}/"
..........something

偶数文字シーケンス:

$ echo something | sed "s/^/${(l[10][<>])}/"
<><><><><>something

関連情報