มีคำสั่งในตัว Linux ที่อนุญาตให้ส่งออกสตริงที่ n ครั้งสตริงการป้อนข้อมูลหรือไม่
มีคำสั่งในตัว Linux ที่อนุญาตให้ส่งออกสตริงที่ n ครั้งสตริงการป้อนข้อมูลหรือไม่
คำตอบ:
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
นี่เป็นคำตอบของ pike ที่กระชับและมีชีวิตชีวามากกว่านี้เล็กน้อย:
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
สิ่งนี้สามารถทำให้เป็นพารามิเตอร์ได้และไม่ต้องการตัวแปร temp คือ FWIW:
printf "%${N}s" | sed 's/ /blah/g'
หรือถ้า$N
เป็นขนาดของ bash array:
echo ${ARR[@]/*/blah}
seq
, yes
และ{1..5}
ไม่ได้ POSIX 7
printf
ระบุรูปแบบของ เกิดอะไรขึ้นถ้าข้อมูลมีสตริงรูปแบบ? นี่เป็นวิธีที่ถูกต้องในการระบุ "ความแม่นยำ" (ความยาว) แบบไดนามิก: printf '%*s' "$N"
- ทำให้เป็นนิสัยที่จะใส่สตริงรูปแบบในเครื่องหมายคำพูดเดี่ยวเพื่อป้องกันการขยายตัวของตัวแปรที่นั่น
ค่อนข้างดีวิธีที่กล่าวถึงแล้ว ไม่สามารถลืมเรื่องอายุที่ดีได้seq
:
[john @ awesome] $ สำหรับ i ใน `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:~$
เปลือกทุบตีมีพลังมากกว่าที่คนส่วนใหญ่คิด :)
yes
, printf
, for i in {1..5}
) ที่ถ้าn
เป็นศูนย์ก็จะส่งกลับสตริงที่ว่างเปล่าโดยไม่ต้องอยู่สถานะของ 1. นอกจากนี้เนื่องจากการทางคณิตศาสตร์สำหรับการเปรียบเทียบจึงเป็นเรื่องง่ายที่จะมีการชดเชยโดยที่ 1 (เช่นโดยการเปลี่ยน<=
ไป<
)
คุณสามารถใช้เคล็ดลับ การสะท้อนตัวแปรว่างเปล่าไม่ได้พิมพ์อะไรเลย ดังนั้นคุณสามารถเขียน:
echo word$wojek{1..100}
ถ้า$wojek1 $wojek2
... $wojek100
เป็นตัวแปรที่ไม่มีอยู่คุณจะได้รับการพูดซ้ำ 100 ครั้งโดยไม่มีสิ่งอื่นใด
$_
แทน$wojek
ทำให้เจตนาชัดเจนขึ้น
ทำซ้ำn
ครั้งเพียงใส่n-1
เครื่องหมายจุลภาคระหว่าง{}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
ทำซ้ำ 'helloworld' ซ้ำสองครั้งหลังจากเสียงสะท้อนแรก
n
ตัวแปร
awk 'BEGIN {while (c++<4) printf "Hello"}'
ผลลัพธ์
HelloHelloHelloHello
ฉันเคยพบคำเตือนไปป์ที่เสียหายกับyes
โซลูชันดังนั้นนี่เป็นอีกทางเลือกที่ดี:
$ seq 4 | sed "c foo"
foo
foo
foo
foo
ตามสิ่งที่ pike กำลังพูดถึง
สำหรับอักขระทุกตัวในสตริง echo
echo ${target//?/$replace}
ตัวอย่างของหัวเรื่องที่ขีดเส้นใต้ด้วย=
อักขระ
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
จะส่งออก
ABCDEF
======
ดูเหมือนว่าจะเชื่อมต่อระหว่าง linux และ OS X และนั่นทำให้ฉันมีความสุข
Njoy!
หากคุณใช้ 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
บังคับให้คำสั่งการจัดรูปแบบที่จะนำเสนอ coreutils ของ GNU ถูกใช้เช่นการแจกแจงลินุกซ์และ Cygwin จำนวนมาก รวมถึงข้อมูลที่นี่สำหรับผู้ที่ขาดข้อมูลที่ใช้งานได้ใน BSD เท่านั้น
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
เอาท์พุท
ten ten ten ten ten ten ten ten ten ten
สมมติว่าคุณต้องการ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
ฉันใช้for
ลูปอย่างชัดเจนเพราะคุณไม่สามารถเขียน{1..$n}
ใน bash: การขยายรั้งจะทำก่อนการทดแทนตัวแปร
ไม่ใช่ลินุกซ์ในตัว แต่ถ้าคุณติดตั้งไพ ธ อนไว้ ..
python
>>>var = "string"
>>>var*n
หรือในหนึ่งบรรทัดตามที่ผู้เสนอความคิดเห็นแนะนำ:
python -c 'print "This is a test.\n" * 10'
ไม่มีเวทมนตร์ที่นี่:
seq 5 | awk '{print "Hello World"}'
ลองอันนี้:
echo $(for i in $(seq 1 100); do printf "-"; done)
จะสร้าง (เส้นประหนึ่งร้อย):