Jak wstawić wiersz u góry pliku tekstowego za pomocą wiersza polecenia?

25

Chcę wstawić tekst na górze już istniejącego pliku. Jak mogę to osiągnąć? Próbowałem echoi teenie udało mi się.

Próbowałem wstawić linię repo na górze sources.listpliku z terminala.

Uwaga

Potrzebuję szybkiego rozwiązania z jednej linii, ponieważ metoda innej odpowiedzi była mi już znana

Anwar
źródło
1
tee dodaje wiersz u dołu pliku, np. echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list- aby uzyskać uprawnienia administratora, musisz także sudo przed tee. Ale dlaczego, do licha, chciałbyś dodać coś na szczycie źródeł.list?
Savvas Radevic
2
@medigeek: gdzieś w historii pytań OP znajdziesz coś na temat instalowania / aktualizowania z repozytorium CD ... Podejrzewam, że to może być powód ...
is
Dziękuję @izx, Twoje założenie jest prawidłowe. Jestem pod wrażeniem. Czy potrafisz także odpowiedzieć na to pytanie? Chodziło o instalację z lokalnego repozytorium za pomocą centrum oprogramowania, a także ustawienie mojego lokalnego repozytorium na najwyższy priorytet bez umieszczania go na szczycie. Dzięki jeszcze raz.
Anwar
1
@izx, oto link o ustawianiu najwyższego priorytetu dla mojego lokalnego repozytorium. Będę zadowolony, jeśli możesz sprawdzić to pytanie dotyczące centrum oprogramowania . Jeszcze raz dziękuję za twój pierwszy komentarz. był bardzo zadowolony.
Anwar
1
@medigeek, możesz zobaczyć to pytanie, aby wyjaśnić tak rzadkie pytanie.
Anwar

Odpowiedzi:

38

To jest naprawdę dość łatwe dzięki sed:

  • sed -i -e '1iHere is my new top line\' filename

  • 1imówi sedowi, aby wstawił tekst następujący w wierszu 1 pliku; nie zapomnij \nowego wiersza na końcu, aby istniejąca linia 1 została przeniesiona do linii 2.

ish
źródło
1
Dzięki. Tylko dla uwagi: jeśli chcesz zamienić, zamiast wstawiać use szamiast i in 1i.
Anwar
3
Niestety nie działa to w przypadku pustego pliku (nie ma linii pięści, więc sed nigdy nie wstawia).
Tino
@Tino W przypadku pustych plików, których można po prostu użyćecho "Text Here" >> Filename
Flotolk
nie działa na MacOS 10
Krishna
7

W ogólnej edycji w miejsce skryptu jest trudne, ale można użyć echoi cat, a następniemv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

Jeśli jednak korzystasz ze źródeł.list, musisz dodać weryfikację i wypunktowanie, aby wykryć błędy itp., Ponieważ tak naprawdę nie chcesz tego stracić. Ale to osobne pytanie :-)

Sean
źródło
Mogę to już zrobić. Potrzebuję rozwiązania jednowierszowego, jak dał izx. jednak dzięki za odpowiedź.
Anwar
1
@AnwarShah - przepraszam! Powinieneś był to powiedzieć w swoim pytaniu :-)
Sean
Przyznaję, +1 za twoją odpowiedź, a także za komentarz. (Nie mogę dać więcej)
Anwar
6
./prepend.sh "myString" ./myfile.txt

wiadomo, że prependto moja niestandardowa powłoka :

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

Użyj również ścieżki relatif lub absolutnej, powinna dobrze działać:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

Aktualizacja :

jeśli potrzebujesz stałego skryptu, otwórz, nano /etc/bash.bashrca następnie dodaj tę funkcję na końcu pliku:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

Ponownie otwórz terminal i ciesz się:

prepend "another line at top" /path/to/my/file.txt
Abdennour TOUMI
źródło
5

A dlaczego nie użyć do tego oryginalnego edytora tekstu? ed jest standardowym edytorem tekstu.

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

Lub jeśli chcesz, aby polecenia były bardziej czytelne:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: przejdź do pierwszej linii
  • i: tryb wstawiania
  • twoje rzeczy, które chcesz wstawić ...
  • .: zatrzymaj wstawianie, wróć do trybu normalnego
  • wq: pisz i rezygnuj, dziękuję, do widzenia.
gniourf_gniourf
źródło
Jak korzystać z podstawiania zmiennych powłoki (w FIRST LINE) z tym?
vp_arth
1
@vp_arth Jeśli zawartość jest zmienna first_linenastępnie: ed -s filename < <(printf '%s\n' 1i "$first_line" . wq). Upewnij się, że zmienna nie rozwija się do pojedynczej kropki i nie zawiera żadnych znaków nowej linii (więc odkaż ją, jeśli pochodzi z danych wprowadzonych przez użytkownika).
gniourf_gniourf
3

Zawsze jest taka awkopcja. Zastąp stringzmienną zawartością. Nie jest to jednak zmiana na miejscu. Osobiście staram się nie wprowadzać zmian w miejscu. To zdecydowanie osobiste preferencje. Dwie rzeczy, -voznaczają zmienną w awk i tutaj zmienna njest używana do skutecznego dopasowania numeru linii NR == 1. Możesz użyć tego na wiele sposobów, po prostu zmieniając wartość ni s.

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

Przykład:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line
slashdot
źródło
2

Możesz używać Vima w trybie Ex:

ex -sc '1i|hello world' -cx sources.list
  1. 1 wybierz 1. linię

  2. i wstaw nowy wiersz tekstu

  3. x Zapisz i zamknij

Steven Penny
źródło
Znacznie prostsze niż inne dotychczas oferowane rozwiązania. Dziękuję Ci.
Pothi Kalimuthu,