क्या कोई अंतर्निहित लिनक्स कमांड है जो एक स्ट्रिंग को आउटपुट करने की अनुमति देता है जो कि इनपुट स्ट्रिंग n है?
क्या कोई अंतर्निहित लिनक्स कमांड है जो एक स्ट्रिंग को आउटपुट करने की अनुमति देता है जो कि इनपुट स्ट्रिंग n है?
जवाबों:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
printf
है कि यह बार-बार प्रारूप स्ट्रिंग, मुक्त करने के लिए "पाशन" करने के लिए अतिरिक्त तर्क लागू होगी। "अधिकता" से मेरा मतलब है कि %
प्लेसहोल्डर्स की तुलना में अधिक तर्क हैं ।
यहाँ एक पुराने ढंग का है जो बहुत पोर्टेबल है:
yes "HelloWorld" | head -n 10
यह ब्रेस विस्तार का उपयोग करते हुए एड्रियन पेट्रेस्कु के उत्तर का एक और पारंपरिक संस्करण है :
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
बैश सरणी का आकार है:
echo ${ARR[@]/*/blah}
printf
प्रारूप के प्रारूप में नहीं मिलाना चाहिए । क्या होगा यदि डेटा में प्रारूप स्ट्रिंग हैं? यह "सटीक" (लंबाई) को गतिशील रूप से निर्दिष्ट करने का सही तरीका है: printf '%*s' "$N"
- इसे चर में विस्तार को रोकने के लिए एकल उद्धरण में प्रारूप स्ट्रिंग को संलग्न करने की आदत डालें।
पहले से बताए गए कुछ अच्छे तरीके। seq
हालांकि पुराने अच्छे के बारे में नहीं भूल सकता :
[जॉन @ कमाल] $ में मैं `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
पहली प्रतिध्वनि के बाद दो बार cho हेलोवर्ल्ड ’दोहराता है।
n
एक चर से प्राप्त करना चाहता हूं ?
awk 'BEGIN {while (c++<4) printf "Hello"}'
नतीजा
नमस्ते नमस्ते नमस्ते नमस्ते
@pike किस पर आधारित था
स्ट्रिंग इको स्ट्रिंग में हर पात्र के लिए
echo ${target//?/$replace}
=
पात्रों के साथ रेखांकित शीर्षक का एक उदाहरण
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
उत्पादन होगा
ABCDEF
======
यह linux और OS X के बीच का पोर्ट लगता है और इससे मुझे खुशी मिलती है।
एन ज्वॉय!
यदि आप बीएसडी पर हैं, तो आप बस उपयोग कर सकते हैं 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 कोरुटिल्स का उपयोग किया जाता है उदा n कई लिनक्स वितरण और सिगविन। उन लोगों के लिए यहाँ जानकारी शामिल है जो यह जानकारी याद कर रहे हैं कि यह केवल BSD seq में काम करता है।
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
आउटपुट
ten ten ten ten ten ten ten ten ten ten
यह मानते हुए कि आप पर्ल के x
ऑपरेटर की तरह कुछ चाहते हैं , जहाँ आपको स्वतः पुनरावृत्ति के बीच एक नई रेखा नहीं मिलती है:
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}
बैश में नहीं लिख सकते हैं : ब्रेस का विस्तार चर प्रतिस्थापन से पहले किया जाता है।
बिल्कुल लिनक्स में नहीं बनाया गया है, लेकिन अगर आपके पास अजगर स्थापित है ..
python
>>>var = "string"
>>>var*n
या एक पंक्ति में, जैसा कि टिप्पणीकार ने सुझाव दिया है:
python -c 'print "This is a test.\n" * 10'
इसको आजमाओ:
echo $(for i in $(seq 1 100); do printf "-"; done)
बनाएंगे (सौ डैश):