web-dev-qa-db-ja.com

文字列の末尾の空白に別の文字を埋め込む

出力したいhello world 20文字を超えています。

printf "%-20s :\n\n" 'hello world!!'

# Actual output
hello world!!        :

# Wanted output
hello world!!========:

ただし、スペースではなく "="で補完する必要があります。それ、どうやったら出来るの?

12
smarber

より一般的な解決策となるように回答を更新しました。参照 以下の私の別の答え シェルブレース展開とpritnfのみを使用してください。

_$ str='Hello World!'
$ sed -r ':loop; s/ (=*):$/\1=:/; t loop' <<< "$(printf '%-20s:\n' "$str" )"
Hello World!========:
_

どのように機能しますか?

この_(=*):$/_は、入力の最後にコロン_=_が後に続く1つのスペース、1つ以上の_:_をキャプチャします。 _=_のセットをグループマッチとして作成すると、_\1_がその後方参照になります。

_:loop_でloopという名前のラベルを定義し、_t loop_でs/ (=*):$/\1=:/が正常に置換されたときにそのラベルにジャンプします。

_\1=:_での置換部分では、常に_=_ sの数を増やし、コロン自体を文字列の最後に戻します。

9
αғsнιη
filler='===================='
string='foo'

printf '%s\n' "$string${filler:${#string}}"

与える

foo=================

${#string}は値$stringの長さであり、${filler:${#string}}はオフセット$filler以降の${#string}のサブストリングです。

出力の合計幅は、$fillerまたは$stringの最大幅になります。

フィラー文字列は、jotがあるシステムでは、次を使用して動的に作成できます

filler=$( jot -s '' -c 16 '=' '=' )

(16 =の場合)。 GNUシステムはseqを使用できます:

filler=$( seq -s '=' 1 16 | tr -dc '=' )

他のシステムでは、Perlまたは文字列を動的に作成する他の高速な方法を使用する場合があります。

20
Kusalananda
printf "%.20s:\n\n" "$str========================="

どこ %.20sは文字列の切り捨て形式です

17
JJoao

それを行う1つの方法:

printf "====================:\r%s\n\n" 'hello world!!'
12
Satō Katsura

Perlのアプローチ:

$ Perl -le '$k="hello world!!"; while(length($k)<20){$k.="=";} print "$k\n"'
hello world!!=======

あるいは、@ SatoKatsuraがコメントで指摘しました:

Perl -le '$k = "hello world!!"; print $k, "=" x (20-length $k), "\n"'

UTFマルチバイト文字をサポートする必要がある場合は、以下を使用します。

Perl_UNICODE='AS' Perl -le '$k = "hello world!!"; print $k, "=" x (20-length $k), "\n"'

シェルで同じアイデア:

v='hello world!!'; while [ ${#v} -lt 20 ]; do v="$v""="; done; printf '%s\n\n' "$v"
5
terdon