Linux命令将字符串重复n次

Get*_*ree 95 linux bash shell command-line text-manipulation

是否有任何内置的 Linux 命令允许输出一个输入字符串的 n 倍的字符串??

Adr*_*scu 103

adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下这是如何工作的吗?我理解 printf 命令,因为它与 C/C++ 中的命令相同。但我不明白 {1..5} 是如何扩展的,以及它如何与“%.0s”部分结合使用。 (8认同)
  • 这有点像 hack :) 尝试运行“printf 'HelloWorld %d\n' 1 2 3 4 5”,它可能会为您点击。%.0s 标志意味着什么都不做,只是在那里接受参数。然后,如果 bash 获得的参数多于格式说明符,它将简单地打印出多个副本,并根据需要获取尽可能多的副本。所以你得到了效果。"printf 'HelloWorld %d%d\n' 1 2 3 4 5 6" 的输出可能使它更加清晰。希望这可以帮助! (4认同)
  • `printf` 的具体特点是它会重复地将多余的参数应用于格式字符串,免费“循环”。我所说的“多余”是指参数比“%”占位符更多。 (4认同)

Den*_*son 86

这是一种非常便携的老式方法:

yes "HelloWorld" | head -n 10
Run Code Online (Sandbox Code Playgroud)

这是使用大括号扩展的Adrian Petrescu答案的更传统版本:

for i in {1..5}
do
    echo "HelloWorld"
done
Run Code Online (Sandbox Code Playgroud)

这相当于:

for i in 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

这是派克答案的更简洁和动态的版本:

printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
Run Code Online (Sandbox Code Playgroud)

  • 是的解决方案非常整洁 (4认同)
  • 一种方法是通过 `sed -n 'H;${x;s/\n//gp}'` 或 `sed -n ':t;${s/\n//gp};N; bt'` 另一个是执行 `echo $(yes "HelloWorld" | head -n 10)`,它在字符串的每个副本之间添加一个空格。另一种方法是通过`tr -d '\n'` 管道它也消除了最后的换行符。 (3认同)
  • 这就像 bash shell 中的 Haskell:Hashell? (2认同)

小智 16

这可以参数化并且不需要临时变量 FWIW:

printf "%${N}s" | sed 's/ /blah/g'
Run Code Online (Sandbox Code Playgroud)

或者,如果$N是 bash 数组的大小:

echo ${ARR[@]/*/blah}
Run Code Online (Sandbox Code Playgroud)

  • 您不应该将数据混合到“printf”的格式说明符中。如果数据包含格式字符串怎么办?这是动态指定“精度”(长度)的正确方法:`printf '%*s' "$N"` - 养成将格式字符串括在单引号中以防止变量扩展的习惯。 (5认同)
  • 这是自`seq`、`yes`和`{1. .5}` 不是 POSIX 7。 (3认同)

小智 16

你可以使用一个技巧。回显空变量不会打印任何内容。所以你可以写:

echo word$wojek{1..100}
Run Code Online (Sandbox Code Playgroud)

如果$wojek1 $wojek2...$wojek100是不存在的变量,您将在没有任何其他内容的情况下重复 100 次。

  • 这是一个丑陋丑陋的黑客,但我情不自禁地喜欢它并使用它。 (3认同)
  • 爱它!也许使用 `$_` 而不是 `$wojek` 会使意图更清晰。 (3认同)

Joh*_*n T 15

已经提到了相当多的好方法。不能忘记美好的旧seq

[john@awesome]$for i in `seq 5`; 做回声“嗨”;完成
你好
你好
你好
你好
你好


bra*_*blc 12

这里没有魔法:

seq 5 | awk '{print "Hello World"}'
Run Code Online (Sandbox Code Playgroud)


Adr*_*scu 11

也许另一种对您更通用和有用的方法:

adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$ 
Run Code Online (Sandbox Code Playgroud)

bash shell 比大多数人想象的更强大:)

  • 你指的是什么分叉?原始答案不需要。'type printf' 的输出是 'printf is a shell builtin',因此在原始 bash 进程中运行。 (2认同)

kev*_*kev 8

重复n次数,只需n-1在 之间加逗号{}

$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Run Code Online (Sandbox Code Playgroud)

在第一个回声后重复 'helloworld' 两次。

  • 不错,但是如果我想从变量中获取 `n` 怎么办? (5认同)
  • 它在每个“helloworld”之后添加一个额外的空格 (3认同)

Ste*_*nny 6

POSIX AWK:

#!/usr/bin/awk -f
function str_repeat(s1, n1) {
   s2 = ""
   for (n2 = 1; n2 <= n1; n2++) {
      s2 = s2 s1
   }
   return s2
}
BEGIN {
   s3 = str_repeat("Sun", 5)
   print s3
}
Run Code Online (Sandbox Code Playgroud)

或 PHP:

<?php
$s3 = str_repeat('Sun', 5);
echo $s3, "\n";
Run Code Online (Sandbox Code Playgroud)


nic*_*kl- 5

基于@pike 的暗示

对于字符串回显字符串中的每个字符

echo ${target//?/$replace}
Run Code Online (Sandbox Code Playgroud)

=带下划线的标题示例

export heading='ABCDEF'; 
export replace='='; 
echo -e "${heading}\n${heading//?/$replace}"
Run Code Online (Sandbox Code Playgroud)

将输出

ABCDEF
======
Run Code Online (Sandbox Code Playgroud)

这似乎可以在 Linux 和 OS X 之间移植,这让我很高兴。

欢乐!


n.c*_*lou 5

我在yes解决方案中遇到过管道损坏警告,所以这是另一个不错的选择:

$ seq 4 | sed "c foo"
foo
foo
foo
foo
Run Code Online (Sandbox Code Playgroud)