Ich habe eine Zeichenfolge wie: dog cat bird whale
Und ich möchte bekommen dog dog cat cat bird bird whale whale
Alle Wörter befinden sich in derselben Zeile. Irgendeine Idee?
Erweiterung der Lösungsfamilie :-).
duplicator.sh
:
for i; do echo -n "$i $i "; done; echo
Ausführbar machen und jetzt:
$ ./duplicator.sh dog cat bird whale
dog dog cat cat bird bird whale whale
Alternativ als Shell-Funktion, um zB innerhalb eines Skripts wiederverwendbar zu sein:
duplicator() {
for i; do echo -n "$i $i "; done; echo
}
die dann direkt ausgeführt werden können, wo definiert als
duplicator dog cat bird whale
Sie könnten verwenden
sed
:Wenn Sie die Änderungen an der Datei direkt speichern möchten, sagen Sie:
Sie könnten auch verwenden
perl
:(Fügen Sie die
-i
Option hinzu, um die Änderungen an der Datei direkt zu speichern.)Oder, wie von Terdon vorgeschlagen :
Zitat aus
perlvar
:quelle
sed -r 's/\S+/& &/g'
.-a
:perl -M5.10.0 -ane 'say join " ", map{$_, $_} @F;'
Was wäre das ohne eine
awk/gawk
Antwort:Wenn ein abschließender Zeilenumbruch wichtig ist:
quelle
for(i=1;i<=NF;++i) printf "%s %s ",$i,$i;
ist sowohl kürzer als auch lesbarer, IMHO.quelle
sed -n 'p;p'
- ich dachte, dass das transparenter darüber ist, was es tut.Wenn Sie Ihre Zeichenfolge in einer Variablen haben,
foo="dog cat bird whale"
können Sie beispielsweise Folgendes tun:Pure Bash:
Erläuterung: Die Klammern werden benötigt, damit die
read
undecho
in derselben Unterschale vorkommen und daher Variablen gemeinsam nutzen können. Ohne sieecho
würde das nur eine leere Zeile ausgeben.coreutils:
Erläuterung: Mit dem
-o
Flag vonjoin
können Sie das Ausgabeformat festlegen. Hier sage ich, dass das erste Feld der ersten Datei (1.1
) gedruckt werden soll , gefolgt vom zweiten Feld der ersten Datei (1.2
) usw. Auf diese Weise wird jedes Feld der ersten Datei zweimal gedruckt. Es wurde jedochjoin
entwickelt, um zwei Eingabezeilen in einem gemeinsamen Feld zu verbinden. Also übergebe ich ihm auch eine Leerzeile (<(echo)
) und ignoriere sie dann. Die-j
Sätze kommen die Feld, es zu einer Einstellung , die nicht (5.) existiert bewirkt , dassjoin
die gesamte Zeile drucken.Wenn Sie sich nicht für Leerzeichen oder die Eingabereihenfolge interessieren, können Sie dies tun
Perl 1:
Erläuterung:
Das obige Skript speichert jedes Feld (von
@F
) zweimal im Array@k
und druckt es dann aus@k
. Wenn Sie die nachgestellte Zeile nicht benötigen, können Sie sie vereinfachenPerl 2:
Erläuterung: Die
-0
Option stellt die Eingabe voneinander zu trennen sind (als hexadezimale oder Oktalzahl, siehe hier für Umtausche). Hier setze ich es auf oktal,040
was ein Leerzeichen ist. Das-p
bewirktperl
, dass jede Eingabe "zeilenweise" gedruckt wird, und da wir das Datensatztrennzeichen auf Leerzeichen gesetzt haben, werden Zeilen jetzt durch Leerzeichen definiert, sodass jedes Feld zweimal gedruckt wird.awk
:Erläuterung:
NF
Gibt die Anzahl der Felder an, sodass das obige Skript jedes Feld durchläuft und an sich selbst anfügt. Sobald dies erledigt ist, drucken wir die Zeile (1;
ist nur eine Abkürzung für print).quelle
Nun zu einer
python
Antwort:Von der Kommandozeile:
Von stdin:
Das Ergebnis in beiden Fällen:
quelle
Etwas übertrieben, aber eine
haskell
Antwort:quelle
Ein anderer Ansatz, bei dem auch nur Bash-Builtins verwendet werden
Ich sehe keine Vorteile im Vergleich zur Top-Antwort, nur um einen etwas anderen Weg zu zeigen, der für manche Zwecke besser geeignet sein könnte.
quelle
echo
ist auch eine in Bash eingebaute Shell (Testtype echo
).