Möchte, dass jede Zeile in einer Datei eine feste Anzahl von Malen wiederholt wird.
zB jede Zeile viermal wiederholen lassen:
a
b
c
wird:
a
a
a
a
b
b
b
b
c
c
c
c
Ich habe einige Suchen durchgeführt, und es gibt eine Menge Fragen und Antworten in umgekehrter Reihenfolge, z. B. das Zusammenführen doppelter Zeilen zu einzelnen Zeilen und vielleicht ein paar zum Verdoppeln von Zeilen durch erneutes Drucken.
Es wäre einfach, dies in C zu tun, aber ich wünschte, ich wüsste mehr über die nativen Befehle, damit ich nicht die ganze Zeit auf diese Art von einmaligen Auswürfen zurückgreifen müsste.
text-processing
sed
awk
perl
Yimin Rong
quelle
quelle
awk
Es sindfor
keine geschweiften Klammern erforderlich, wenn nur ein Befehl wiederholt werden muss. Undperl
ist einfacher , wenn Sie verwendenforeach
Schleife:for$i(0..3){print}
.perl -ne 'print(($_)x4)'
. Außerdem sollten Sie$line
(in Echo) in Ihrer Bash-Version zitieren .BEGIN { ORS="\r\n" }
Ich frage mich, ob dies ein Golfspiel wird :
Erläuterung:
Der
p
Befehl von sed besteht darin, die aktuelle Zeile auszudrucken. Standardmäßig wird die aktuelle Zeile gedruckt, bevor zur nächsten Zeile gewechselt wird (deshalb muss sed das Deaktivieren-n
zulassen). Einige ältere Seds haben kein Semikolon (glaube ich), so dass es möglich ist, dass Sie dies tun müssensed -e p -e p -e p
Awk arbeitet mit
condition {action}
Paaren. Wenn die Aktion weggelassen wird, wird standardmäßig die aktuelle Zeile gedruckt, wenn die Bedingung true zurückgibt. Awk behandelt wie viele C-ähnliche Sprachen1
als wahr. (Der Vollständigkeit halber wird die Aktion für jeden Datensatz ausgeführt, wenn die Bedingung weggelassen wird.)Viele Perl-Funktionen nutzen die "Standard" -Variable. Dieser Einzeiler entspricht (auf Perl 5.16):
quelle
1
ja, gewinnst du :) Was genau macht das in awk? Abkürzung fürprint $0
?1
(true). Der Standardblock ist äquivalent zu{print}
. Die Anweisung1
würde also bedeuten, den aktuellen Zeilenpuffer ({print}
) zu drucken . ({print}
und{print $0}
sind meistens gleich, qed.)sed
, das keine Semikolons als Befehlsabschlusszeichen unterstützt. gibt es so etwas wirklich?quelle
Sie können dies tun , ohne
sed
,perl
oderawk
.oder mit einer while-Schleife:
Beispiele
for-Schleife while-Schleifequelle
Mit rein shell:
quelle
--help
als Zeichenfolge anstelle einer Option betrachtet? [Betrachten Sie den Fall, woline
ist--help
oder eine andere Option]yes -- --help
yes
undhead
bedeutet, dies ist nicht "rein Shell"Dies könnte für Sie funktionieren (GNU sed):
Wiederholt jede Zeile 4 Mal.
Oder wenn Sie es vorziehen:
Wo Sie jede Zeile noch 3 Mal wiederholen.
quelle
@potongs Antwort funktioniert nicht mit Leerzeilen, das Ersetzen
\+
durch*
sollte das Problem beheben:quelle