Mam zewnętrzny program, który produkuje plik wyjściowy (duże, możliwe 20 000 wierszy).
Muszę wstawić nową linię między istniejącą linią 1 i linią 2. Patrzyłem na awk i sed - Używam jednej wkładki w każdej dość regularnie - ale nie byłem w stanie wymyślić odpowiednich przełączników do Zrób to.
text-processing
sed
awk
Tim Brigham
źródło
źródło
awk 'NR==2 {print "new line"} 1'
W konkretnym przypadku powinno to być prostsze:
Objaśnienie: w wierszu 1 wykonaj następujące czynności
Następnie linia (teraz pusta) jest drukowana ponownie jako część cyklu.
Jeśli chcesz dodać nową linię zamiast nowego znaku linii (co początkowo rozumiałem), po prostu użyj
sed
poleceniaa\
(dołącz):lub nawet
Dołącza „
appended line
” po wierszu 1.źródło
sed -i '1 a\\' file
tylko dla nowej linii.'1 aapended line'
przykład.Myślę, że
sed
podejście byłoby:sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt
Spowoduje to przeniesienie tekstu do drugiej linii pliku, a następnie faktyczna druga linia z pliku stanie się trzecią.
Zauważ, że używając trybu dołączania , jeśli musiał, musiał użyć pierwszego wiersza, ponieważ dołączanie nastąpi po zanotowanym numerze wiersza.
sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt
źródło
Wyjaśnienie.
źródło
To może Ci pomóc:
Jeśli chcesz wstawić
something
po nowej linii:Lub jeśli sed obsługuje
\n
:Oczywiście
a
jest jeszcze łatwiej:źródło
\n
do pierwszego!Zwykle używam
ed
do tego:Podobne do
sed
rozwiązania, ale bez bałaganu uciekających nowych linii.źródło
echo
„s, w szczególności w ramachbash
:ed - filename <<< $'1a\nLine to insert\n.\nw'
.dash
, która jest w wielu systemach/bin/sh
.echo
”. Sparing wszystkoecho
jest to rzeczywiściebash
tylko cecha, ale zmniejszającecho
liczbę od 4 do 1 w pracachdash
iksh
zbyt:echo '1a\nLine to insert\n.\nw' | ed - filename
.printf %s\\n
, który umieszcza nową linię po każdym argrze, który jej podajesz i nie psuje znaków specjalnych osadzonych w linii, którą chcesz wstawić. Ponadto,ed
po co korzystać, kiedyex
jest dostępny?Rozwiązanie Python
źródło
Używanie
sed
i (specyficzne dla Bash) kodów ucieczki ANSI:źródło
użyłbym do tego Pythona
źródło
Po prostu lubię używać jawnego licznika:
źródło
Najprostsza metoda wykorzystuje
printf
iex
:1a
oznacza „dołącz po pierwszej linii”;.
kończy dołączanie;x
oznacza zapisz i wyjdź.źródło
Żadna z powyższych odpowiedzi nie wspomina o tym, jak zapisać zmiany w oryginalnym pliku, czyli myślę, że o to poprosił OP.
Z pewnością tego potrzebowałem, kiedy przechodziłem do strony.
Zakładając, że plik się nazywa
output.txt
Moim szczególnym przypadkiem użycia jest automatyczne dodanie deklaracji arkusza stylów xsl do pliku xun junita.
źródło