私は| 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 L
、b
ラベルでL
少しagoto
)。 /^ \{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