入力文字列のn倍の文字列を出力できる組み込みLinuxコマンドはありますか??
入力文字列のn倍の文字列を出力できる組み込みLinuxコマンドはありますか??
回答:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
printf
、それが繰り返し自由のための「ループ」、フォーマット文字列に余分な引数を適用することです。「過剰」とは、%
プレースホルダーよりも多くの引数があることを意味します。
かなりポータブルな昔ながらの方法を次に示します。
yes "HelloWorld" | head -n 10
これは、ブレース展開を使用したAdrian Petrescuの回答のより一般的なバージョンです。
for i in {1..5}
do
echo "HelloWorld"
done
それは次と同等です:
for i in 1 2 3 4 5
これは、パイクの答えのもう少し簡潔で動的なバージョンです。
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
sed -n 'H;${x;s/\n//gp}'
か、sed -n ':t;${s/\n//gp};N;bt'
別のやっているecho $(yes "HelloWorld" | head -n 10)
文字列の各コピーの間にスペースを追加しています。さらに別の方法は、それをパイプ処理することtr -d '\n'
です。これにより、最後の改行も削除されます。
yes
解決策は、私が(その出力変動)コマンドを複製したかったので、私は、まさに必要でした。したがって:yes "$(my-command)" | head -n 2
これはパラメーター化でき、一時変数FWIWは不要です。
printf "%${N}s" | sed 's/ /blah/g'
または、$N
bash配列のサイズが次の場合:
echo ${ARR[@]/*/blah}
printf
の形式指定子に混在させないでください。データにフォーマット文字列が含まれている場合はどうなりますか?これは、「精度」(長さ)を動的に指定する正しい方法printf '%*s' "$N"
です。
すでに述べたいくつかの良い方法。古き良き時代を忘れることはできませんseq
。
[john @ awesome] $ for i in `seq 5`; 「こんにちは」をエコーします;完了 こんにちは こんにちは こんにちは こんにちは こんにちは
{i..j}
トリックが空の範囲を返すことはありません。)
おそらくより一般的で便利な別の方法:
adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
bashシェルは、ほとんどの人が考えるよりも強力です:)
yes
、printf
、for i in {1..5}
)場合にn
ゼロであり、それは空の文字列を返すによる比較するための数学的表記することも1の状態を存在せず、それは1だけオフセットしていることは容易である(変化させることにより、例えば、<=
への<
)
繰り返しn
、n-1
カンマを次の間に入れて{}
ください:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
最初のエコーの後に「helloworld」を2回繰り返します。
n
、変数から取得したい場合はどうすればいいですか?
BSDを使用してseq
いる場合は、を使用できます。
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
seq (GNU coreutils) 8.25
、これによりseq: format 'Hello, world' has no % directive
、フォーマットディレクティブが存在するように強制されます。GNU coreutilsが使用されています(例:多くのLinuxディストリビューションおよびCygwin)。BSD seqでのみ機能するという情報が欠落している人のために、ここに情報を含めます。
x
繰り返しの間に改行を自動的に取得しないPerlの演算子のようなものが必要だと仮定します。
x() {
# usage: x string num
for i in $(seq 1 $2); do printf "%s" "$1"; done
# print a newline only if the string does not end in a newline
[[ "$1" == "${1%$'\n'}" ]] && echo ""
}
x Hi 10 # ==> HiHiHiHiHiHiHiHiHiHi
x $'Hello World!\n' 3
bashでfor
記述できないため、ループを明示的に使用しました{1..$n}
。変数置換の前にブレース展開が行われます。
正確にはLinuxに組み込まれていませんが、Pythonがインストールされている場合。
python
>>>var = "string"
>>>var*n
または、コメンターが示唆したように、1行で:
python -c 'print "This is a test.\n" * 10'