Chciałbym, aby każda linia w pliku była powtarzana określoną liczbę razy.
np. niech każda linia powtórzy się cztery razy:
a
b
c
staje się:
a
a
a
a
b
b
b
b
c
c
c
c
Przeszukałem kilka stron i jest wiele pytań i odpowiedzi na odwrót, np. Łączenie zduplikowanych linii w pojedyncze linie, a może kilka na temat podwajania linii poprzez ich ponowne wydrukowanie.
Łatwo byłoby to zrobić w C, ale chciałbym wiedzieć więcej o natywnych poleceniach, więc nie musiałbym uciekać się do tego rodzaju jednorazowych rzutów.
text-processing
sed
awk
perl
Yimin Rong
źródło
źródło
awk
„sfor
nie potrzebuje szelki, jeśli jest tylko jedno polecenie, aby powtórzyć. Iperl
jest prostsze, jeśli używaszforeach
pętli:for$i(0..3){print}
.perl -ne 'print(($_)x4)'
. Powinieneś również cytować$line
(w echu) w swojej wersji bash.BEGIN { ORS="\r\n" }
Zastanawiam się, czy to zamienia się w mecz golfowy :
Wyjaśnienie:
p
Poleceniem sed jest wydrukowanie bieżącej linii. Domyślnym zachowaniem jest wydrukowanie bieżącej linii tuż przed przejściem do następnej linii (dlatego sed musi-n
pozwolić ci ją wyłączyć). Niektóre starsze sedy nie mają średnika (tak myślę), więc możliwe, że będziesz musiał to zrobićsed -e p -e p -e p
Awk działa z
condition {action}
parami. Jeśli akcja zostanie pominięta, domyślnie drukowany jest bieżący wiersz, jeśli warunek zwraca wartość true. Awk, podobnie jak wiele języków podobnych do C, traktuje1
jako prawdę. (Dla kompletności, jeśli warunek zostanie pominięty, akcja zostanie wykonana dla każdego rekordu).Wiele funkcji perla wykorzystuje zmienną „domyślną”. Ten liniowiec jest równoważny (na perl 5.16):
źródło
1
awk? Stenografia dlaprint $0
?1
(prawda); domyślny blok jest równoważny z{print}
. Tak więc instrukcja1
oznaczałaby wydrukowanie bieżącego bufora linii ({print}
). ({print}
i{print $0}
są w większości takie same, qed.)sed
że nie obsługuje średników jako terminatorów poleceń; czy naprawdę jest coś takiego?źródło
Można to zrobić bez potrzeby
sed
,perl
lubawk
.lub za pomocą pętli while:
Przykłady
dla pętli pętla whileźródło
Używając wyłącznie powłoki:
źródło
--help
jako ciąg zamiast opcji? [rozważ przypadek, w którymline
jest--help
lub inna opcja]yes -- --help
yes
ihead
oznacza to, że nie jest to „czysto skorupa”To może Ci pomóc (GNU sed):
Powtórzy każdą linię 4 razy.
Lub jeśli wolisz:
Gdzie powtórzysz każdą linię jeszcze 3 razy.
źródło
Odpowiedź @potong nie działa z pustymi liniami, zastąpienie
\+
przez*
powinno to naprawić:źródło