Czy jest jakieś wbudowane polecenie Linuksa, które pozwala wyprowadzić ciąg, który jest n razy ciągiem wejściowym?
linux
command-line
bash
shell
text-manipulation
Uwolnić się
źródło
źródło
Odpowiedzi:
źródło
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:
To jest bardziej konwencjonalna wersja odpowiedzi Adriana Petrescu z użyciem rozszerzenia nawiasów klamrowych:
Odpowiada to:
To jest nieco bardziej zwięzła i dynamiczna wersja odpowiedzi szczupaka :
źródło
sed -n 'H;${x;s/\n//gp}'
lubsed -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:
Lub jeśli
$N
jest wielkości tablicy bash:źródło
seq
,yes
i{1..5}
nie są POSIX 7.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
:źródło
{i..j}
Sztuczka nigdy nie zwraca pustego zakresu.)Być może inny sposób, który jest bardziej ogólny i przydatny dla Ciebie:
Powłoka bash jest silniejsza niż myśli większość ludzi :)
źródło
yes
,printf
,for i in {1..5}
), że jeślin
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ć:
Jeśli
$wojek1 $wojek2
...$wojek100
nieistniejące zmienne, twoje słowo zostanie powtórzone 100 razy bez niczego innego.źródło
$_
zamiast$wojek
sprawia, że zamiar jest jaśniejszy.Powtórz
n
czasy, po prostu wstawn-1
przecinki między{}
:Powtarza „helloworld” dwa razy po pierwszym echu.
źródło
n
zmienną?Wynik
źródło
Z rozwiązaniem spotkałem się z ostrzeżeniami o uszkodzonej rurze
yes
, więc oto kolejna dobra alternatywa:źródło
na podstawie tego, na co wskazywał @pike
dla każdego znaku w ciągu ciąg echa
Przykład nagłówka podkreślonego
=
znakamiwyjdzie
Wydaje się, że jest to port pomiędzy Linuksem a OS X i to mnie cieszy.
nJoy!
źródło
Jeśli korzystasz z BSD, możesz po prostu użyć
seq
.źródło
seq (GNU coreutils) 8.25
daje toseq: 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.wyjścia
źródło
Zakładając, że potrzebujesz czegoś takiego jak
x
operator Perla , w którym nie otrzymujesz automatycznie nowej linii między powtórzeniami:Jawnie użyłem
for
pętli, ponieważ nie można pisać{1..$n}
bash: interpretacja nawiasów jest wykonywana przed podstawieniem zmiennej.źródło
Nie do końca wbudowany w Linuksa, ale jeśli masz zainstalowany Python ...
Lub w jednym wierszu, jak sugerował komentator:
źródło
Brak magii tutaj:
seq 5 | awk '{print "Hello World"}'
źródło
Spróbuj tego:
Stworzy (sto myślników):
źródło