Czy jest jakieś wbudowane polecenie Linuksa, które pozwala wyprowadzić ciąg, który jest n razy ciągiem wejściowym?
Czy jest jakieś wbudowane polecenie Linuksa, które pozwala wyprowadzić ciąg, który jest n razy ciągiem wejściowym?
Odpowiedzi:
adrian@Fourier:~$ printf 'HelloWorld\n%.0s' {1..5}
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
printf
jest to, że wielokrotnie zastosować nadmiar argumenty ciąg Format „pętli” za darmo. Przez „nadmiar” rozumiem, że jest więcej argumentów niż %
symboli zastępczych.
Oto staromodny sposób, który jest dość przenośny:
yes "HelloWorld" | head -n 10
To jest bardziej konwencjonalna wersja odpowiedzi Adriana Petrescu z użyciem rozszerzenia nawiasów klamrowych:
for i in {1..5}
do
echo "HelloWorld"
done
Odpowiada to:
for i in 1 2 3 4 5
To jest nieco bardziej zwięzła i dynamiczna wersja odpowiedzi szczupaka :
printf -v spaces '%*s' 10 ''; printf '%s\n' ${spaces// /ten}
sed -n 'H;${x;s/\n//gp}'
lub sed -n ':t;${s/\n//gp};N;bt'
innym, echo $(yes "HelloWorld" | head -n 10)
co powoduje dodanie spacji między każdą kopią ciągu. Jeszcze innym sposobem jest przepuszczenie go, tr -d '\n'
co również eliminuje końcową nową linię.
yes
Rozwiązaniem było dokładnie to, co potrzebne, ponieważ chciałem powielać polecenie (którego moc waha). Tak więc:yes "$(my-command)" | head -n 2
Można to sparametryzować i nie wymaga zmiennej temp, FWIW:
printf "%${N}s" | sed 's/ /blah/g'
Lub jeśli $N
jest wielkości tablicy bash:
echo ${ARR[@]/*/blah}
printf
specyfikatorem formatu. Co jeśli dane zawierają ciągi formatujące? Jest to właściwy sposób na dynamiczne określenie „precyzji” (długości): printf '%*s' "$N"
- nawyk umieszczania ciągu formatu w pojedynczych cudzysłowach, aby zapobiec rozszerzaniu się zmiennych.
Wymieniono już kilka dobrych sposobów. Nie można jednak zapomnieć o starym dobrym seq
:
[John @ awesome] $ dla i w `seq 5`; wykonaj echo „Cześć”; gotowe cześć cześć cześć cześć cześć
{i..j}
Sztuczka nigdy nie zwraca pustego zakresu.)
Być może inny sposób, który jest bardziej ogólny i przydatny dla Ciebie:
adrian@Fourier:~$ n=5
adrian@Fourier:~$ for (( c=1; c<=n; c++)) ; do echo "HelloWorld" ; done
HelloWorld
HelloWorld
HelloWorld
HelloWorld
HelloWorld
adrian@Fourier:~$
Powłoka bash jest silniejsza niż myśli większość ludzi :)
yes
, printf
, for i in {1..5}
), że jeśli n
jest zero, zwraca pusty ciąg bez istnieć stan 1. Również ze względu na notacji matematycznej dla porównania, jest to łatwe do przesunięcia o 1 (np zmieniając <=
się <
)
Możesz użyć lewy. Wyszukanie pustej zmiennej nic nie drukuje. Możesz więc napisać:
echo word$wojek{1..100}
Jeśli $wojek1 $wojek2
... $wojek100
nieistniejące zmienne, twoje słowo zostanie powtórzone 100 razy bez niczego innego.
$_
zamiast $wojek
sprawia, że zamiar jest jaśniejszy.
Powtórz n
czasy, po prostu wstaw n-1
przecinki między {}
:
$ echo 'helloworld'{,,}
helloworld helloworld helloworld
Powtarza „helloworld” dwa razy po pierwszym echu.
n
zmienną?
awk 'BEGIN {while (c++<4) printf "Hello"}'
Wynik
Cześć cześć cześć cześć
na podstawie tego, na co wskazywał @pike
dla każdego znaku w ciągu ciąg echa
echo ${target//?/$replace}
Przykład nagłówka podkreślonego =
znakami
export heading='ABCDEF';
export replace='=';
echo -e "${heading}\n${heading//?/$replace}"
wyjdzie
ABCDEF
======
Wydaje się, że jest to port pomiędzy Linuksem a OS X i to mnie cieszy.
nJoy!
Jeśli korzystasz z BSD, możesz po prostu użyć seq
.
$ seq -f "Hello, world" 5
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
seq (GNU coreutils) 8.25
daje to seq: format 'Hello, world' has no % directive
, wymuszając obecność dyrektywy formatującej. Coreutils GNU są używane np. W wielu dystrybucjach Linuksa i Cygwin. W tym informacje dla tych, którym brakuje informacji, że działa tylko w sekwencji BSD.
line="==========================="
line=${line:0:10}
${line//"="/"ten "}
wyjścia
ten ten ten ten ten ten ten ten ten ten
Zakładając, że potrzebujesz czegoś takiego jak x
operator Perla , w którym nie otrzymujesz automatycznie nowej linii między powtórzeniami:
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
Jawnie użyłem for
pętli, ponieważ nie można pisać {1..$n}
bash: interpretacja nawiasów jest wykonywana przed podstawieniem zmiennej.
Nie do końca wbudowany w Linuksa, ale jeśli masz zainstalowany Python ...
python
>>>var = "string"
>>>var*n
Lub w jednym wierszu, jak sugerował komentator:
python -c 'print "This is a test.\n" * 10'
Spróbuj tego:
echo $(for i in $(seq 1 100); do printf "-"; done)
Stworzy (sto myślników):