문자열을 n 번 반복하는 Linux 명령


71

n 배의 입력 문자열 인 문자열을 출력 할 수있는 내장 Linux 명령이 있습니까?


1
"내장 리눅스 명령"이란 쉘 명령을 의미한다고 가정하고, 어떤 쉘을 사용하고 있는지 언급하지 않기 때문에 bash라고 가정합니다. 명령 줄에 "echo $ SHELL"을 입력하여이를 확인할 수 있으며 "/ bin / bash"와 비슷한 것을 얻을 수 있습니다. 그렇지 않으면 답변을 편집하여 표시되는 내용을 지정해야합니다. 건배 :)
Adrian Petrescu

7
질문에 "bash"를 태그했습니다. 충분하다고 생각했습니다.
GetFree

답변:


75
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$

3
이것이 어떻게 작동하는지 설명해 주시겠습니까? printf 명령은 C / C ++의 것과 동일하기 때문에 이해합니다. 그러나 {1..5}가 어떻게 확장되고 "% .0s"부분과 함께 작동하는지 이해하지 못합니다.
GetFree

4
그것은 약간의 해킹입니다 :) "printf 'HelloWorld % d \ n'1 2 3 4 5"를 실행 해보십시오. 아마도 당신을 위해 클릭 할 것입니다. % .0s 플래그는 아무 것도하지 않기위한 것입니다. 그런 다음 bash가 형식 지정자보다 많은 인수를 얻으면 필요한만큼 많은 사본을 가져 와서 여러 사본을 인쇄합니다. 따라서 효과가 나타납니다. "printf 'HelloWorld % d % d \ n'1 2 3 4 5 6"의 결과는 아마 더 명확 해집니다. 도움이 되었기를 바랍니다!
Adrian Petrescu

내가 참조. 반복을 허용하는 것은 printf의 특정한 행동입니다
GetFree

1
(순전히 이론적 인 관점에서 볼 때 이것은 외부 프로세스가 아닌 단일 쉘 프리미티브를 사용하므로 가장 빠른 솔루션 일 것입니다. 실제로 bash 스크립트의 성능은 중요하지 않습니다. )
Adrian Petrescu

1
무엇 이며 특정하는 것은 printf이 반복적으로 무료로 형식 문자열, "루프"를 초과 인수를 적용 할 것입니다. "초과"라는 말은 %자리 표시 자 보다 더 많은 논증이 있음을 의미합니다 .
Dennis Williamson

69

휴대가 편리한 구식 방법은 다음과 같습니다.

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}

yes 명령을 사용할 때 새 줄을 어떻게 제거합니까?
GetFree

3
한 가지 방법은 파이프를 연결 sed -n 'H;${x;s/\n//gp}'하거나 sed -n ':t;${s/\n//gp};N;bt'다른 방법으로 연결하여 echo $(yes "HelloWorld" | head -n 10)각 문자열 복사본 사이에 공백을 추가하는 것입니다. 또 다른 방법은 tr -d '\n'최종 줄 바꿈을 제거하는 파이프 입니다.
Dennis Williamson

2
bash 쉘의 Hakell과 같습니다 : Hashell?
wchargin

4
yes 솔루션은 매우 깔끔합니다
piggybox

yes내가 (출력이 변동) 명령을 복제하고 싶어하기 때문에 솔루션은 내가 필요 정확히이었다. 따라서 :yes "$(my-command)" | head -n 2
arnsholt

14

이것은 매개 변수화 될 수 있으며 임시 변수 FWIW가 필요하지 않습니다.

printf "%${N}s" | sed 's/ /blah/g'

또는 $Nbash 배열의 크기 인 경우 :

echo ${ARR[@]/*/blah}

3
이 짧은이다 POSIX (7) 내가 지금까지 이후 본 솔루션 seq, yes그리고 {1..5}7 POSIX되지 않습니다
치로 틸리新疆改造中心法轮功六四事件

데이터를 printf형식 지정자 로 혼합해서는 안됩니다 . 데이터에 형식 문자열이 포함되어 있으면 어떻게됩니까? 이것은 "정밀도"(길이)를 동적으로 지정하는 올바른 방법입니다 printf '%*s' "$N".-변수 확장을 막기 위해 형식 문자열을 작은 따옴표로 묶는 습관을들이십시오.
데니스 윌리엄슨

13

이미 몇 가지 좋은 방법이 언급되었습니다. seq그래도 좋은 것을 잊을 수는 없습니다 .

`seq 5`에서 i의 경우 [john @ awesome] $; 에코 "안녕하세요"; 완료
안녕하세요
안녕하세요
안녕하세요
안녕하세요
안녕하세요

이것은 실제로 0을 존중하여 0으로 취급합니다! ( {i..j}트릭은 절대 빈 범위를 반환하지 않습니다.)
JellicleCat

10

아마도 더 일반적이고 유용한 다른 방법 일 것입니다.

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

bash 쉘은 대부분의 사람들이 생각하는 것보다 강력합니다. :)


이것은 전적으로 쉘 내부이기 때문에 내 투표를 얻습니다. 포크가 필요 없습니다.
esm

2
무슨 포크를 말하는거야? 원래 답변은 필요하지 않습니다. 'type printf'의 출력은 'printf is shell builtin'이며 따라서 원래 bash 프로세스 내에서 실행됩니다.
CodeGnome

이것은 지금까지 (단 하나 yes, printf, for i in {1..5})가이 경우에 것을 n제로, 그것은 빈 문자열을 반환으로 인해 비교 수학적 표기법도 1의 상태를 존재하지 않고,은 1로 상쇄하기 쉽다 (변화에 의해 예 <=를을 <)
Mehrad Mahmoudian

10

트릭을 사용할 수 있습니다. 빈 변수를 반향해도 아무 것도 인쇄되지 않습니다. 그래서 당신은 쓸 수 있습니다 :

echo word$wojek{1..100}

경우 $wojek1 $wojek2... $wojek100존재하지 않는 변수는 당신은 당신의 말은 아무것도없이 100 번 반복 얻을 것이다.


1
그것은 못생긴 해킹이지만, 나는 그것을 사랑하고 그것을 사용할 수는 없습니다.
16807

그것을 사랑하십시오! 어쩌면 $_대신에 $wojek사용하면 의도가 더 명확 해집니다.
Mihai Todor

7

반복 n시간, 그냥 넣어 n-1쉼표를 사이 {}:

$ echo 'helloworld'{,,}
helloworld helloworld helloworld

첫 번째 반향 후에 'helloworld'를 두 번 반복합니다.


5
좋지만 n변수에서 가져 오려면 어떻게해야 합니까?
GetFree

1
각 'helloworld'뒤에 추가 공간을 추가합니다
PADYMKO

이것은 문자열에 개행을 넣을 수없는 것처럼 보입니다 (즉, helloworld를 자체 줄로 가져 오기)
TankorSmash

5
awk 'BEGIN {while (c++<4) printf "Hello"}'

결과

HelloHelloHelloHello

awk없이 이것을 사용하십시오 : while ((c ++ <5)); printf 'hello'를하십시오; 완료
emf

4

yes솔루션으로 파이프 경고가 끊어졌습니다. 또 다른 좋은 대안이 있습니다.

$ seq 4 | sed "c foo"
foo
foo
foo
foo

3

@pike가 힌트를 준 것에 따라

문자열 에코 문자열의 모든 문자에 대해

echo ${target//?/$replace}

밑줄이 그어진 =문자 의 예

export heading='ABCDEF'; 
export replace='='; 
echo -e "${heading}\n${heading//?/$replace}"

출력합니다

ABCDEF
======

이것은 리눅스와 OS X 사이를 포팅하는 것으로 보이며 행복합니다.

조이!


3

BSD를 사용하는 경우을 사용할 수 있습니다 seq.

$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world

1
에서 seq (GNU coreutils) 8.25,이 준다 seq: format 'Hello, world' has no % directive, 서식 지시자를 강제로 존재합니다. GNU coreutils는 많은 리눅스 배포판과 Cygwin에서 사용됩니다. BSD seq에서만 작동하는 정보가 누락 된 사람들을 위해 여기에 정보를 포함하십시오.
Palec

2
line="==========================="
line=${line:0:10}
${line//"="/"ten "}

출력

ten ten ten ten ten ten ten ten ten ten

좀 더 장황한 예제 일 수 있습니다 : declaration c = '-----'; c = $ {c // $ {c : 0 : 1} / $ c}; echo $ c # "-"를 25 번 인쇄합니다.
Stephen Niedzielski

2

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}. 가변 확장은 변수 대체 전에 수행됩니다.


2

리눅스에 정확히 내장되어 있지는 않지만 파이썬이 설치되어 있다면 ..

python
>>>var = "string"
>>>var*n

또는 논평자가 제안한 바와 같이 한 줄로 :

python -c 'print "This is a test.\n" * 10'

4
쉘 스크립트 등에 쉽게 통합 할 수 없기 때문에 그다지 유용하지는 않습니다. 그리고 쉘 자체에서 이것을 수행하는 약 10 억 가지 방법이 있기 때문에 큰 총 (예 : 파이썬)을 가져올 이유가 거의 없습니다. .
Adrian Petrescu

7
내가 두 번째 점에 동의하지만 주먹이 ... 그것은 쉘 스크립트에 통합하기 쉽습니다 : 파이썬 -c '프린트'. 이것은 테스트입니다 \ n "* 10 '
larsks

나는이 솔루션의 가독성을 좋아합니다. ;)
elias

2

여기 마법이 없습니다 :

seq 5 | awk '{print "Hello World"}'


1

이거 한번 해봐:

echo $(for i in $(seq 1 100); do printf "-"; done)

만들 것입니다 (백 대시) :


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.