2010-09-24 11 views
7

Próbuję wstawić niektóre informacje dotyczące praw autorskich do kopii na początku niektórych plików źródłowych. Wiem, że przy użyciu sed w następujący sposób:Wstawianie tekstu z pliku na początek innego pliku - bash

sed "1iSome copyrighted information." sample.txt 

by wstawić tekst „Niektóre informacje chronione prawem autorskim” na początku przykład.txt.
Potrzebuję wstawić tekst z pliku na początek pliku sample.txt. Czy istnieje jakiś sposób, w sed, że mogę użyć polecenia cat dla powyższego celu, powiedzieć coś jak następujące ?:

sed "1i{cat header.txt}" sample.txt 

Mam googled dla wyżej i nie znalazłem dokładnie to, czego szukaliśmy. Każda pomoc w tym zakresie jest bardzo mile widziana.

Dzięki.

Odpowiedz

8

obsłudze edytor tekstu ed:

echo -e '0r header.txt\nw' | ed sample.txt 

lub użyć vi/ex polecenie:

vi - +'0r header.txt|wq' sample.txt 

Ale nie widzę żadnego sposobu na wykonanie polecenia w sed.

+0

dzięki! To działało ładnie .. – Sriram

4
cat header.txt sample.txt > temp.txt 
mv temp.txt sample.txt 
+0

, który umieści nagłówek pod próbką – ghostdog74

+0

ok ... ale czy jest prostszy sposób to zrobić, może z sed? – Sriram

+1

To spowoduje dodanie pliku sampte.txt do pliku header.txt. Zamówienie jest poprawne. Po twoim komentarzu spróbowałem ponownie. To działa. – tangens

1

Jeśli naprawdę chcesz to zrobić za pomocą sed:

INFO=$(cat header.txt) # read the contents of file headers.txt into var INFO 
sed -i "1i$INFO" sample.txt # insert $INFO, use -i to change the file inplace 

Chciałbym jednak wykorzystać metodę opartą na cat.

+1

Myślę, że ta metoda nie działałaby, gdyby twój nagłówek zawierał pewne ciągi, które sed interpretuje jako polecenie. – tangens

+0

tangens ma rację, to nie działa. plik header.txt zawiera informacje w postaci komentarzy w stylu C (/ * i * /), które sed interpretuje jako polecenie. – Sriram

0

Dlaczego nie zrobić tego odwrotnie, np. dołączyć twoje pliki źródłowe do twojego pliku z prawami autorskimi?

Komenda

'kot' jest skrótem od 'Połączenie', można po prostu powiedzieć

for f in *.c 
do 
    cp $f /tmp 
    cat copyright.txt /tmp/$f >$f 
done 
+0

Masz poważny problem z oczyszczaniem w/tmp - i zakłada, że ​​w ogóle nie działasz w/tmp! –

+1

Niezupełnie, do czego służy/tmp. Jeśli jesteś szczęśliwy, po prostu je przywołaj, jeśli nie, masz gwarancję, że możesz cofnąć zmianę. – Gaius

8

Jeśli masz GNU sed:

sed -i -e '2{x;G};1{h;rheader.txt' -e 'd}' sample.txt 

sample.txt musi zawierać co najmniej dwie linie.

Ta metoda działa, nawet jeśli plik nagłówkowy zawiera znaki specjalne dla sed.

Objaśnienie:

  • -i - edytować plik w miejscu
  • -e - przełamać skryptu na sekcje - jest to konieczne w tym przypadku ograniczają końcu nazwy pliku nagłówka (może to być również ograniczona przez nowego wiersza)
  • 1{h; - na pierwszej linii pliku (przykład.txt) Zapisz go trzymać przestrzeń
  • rheader.txt - czytamy w pliku header (nagłówek.txt)
  • d} - usunąć oryginalne pierwszą linię pliku z przestrzeni wzoru i obróbki końcowej linii 1 - usunięcie go tutaj zapobiega dodatkowy pusty wiersz przed wstawiany na początku pliku
  • nagłówku zawartość pliku są teraz wyjście
  • 2{x; - gdy linia 2 pliku (sample.txt) jest odczytywany, zamienić go w przestrzeń ładowni i przestrzeni wymiany hOLD (zawierającej oryginalną linię 1) do przestrzeni wzorów
  • G} - dołączanie przestrzeń trzymać się koniec obszaru wzoru (który zawiera teraz oryginalne wiersze 1 i 2) i pełne przetwarzanie linii 2
  • linie 1 i 2 są teraz wyprowadzane, następnie przetwarzanie jest kontynuowane dla reszty pliku, który składa się z prostego czytania i wyprowadzania każdej linii.

Edytuj: Usunąłem zbędne polecenie z wersji, którą pierwotnie opublikowałem.

+1

Wyjaśnienie, jak to działa, będzie wspaniałe :) – codaddict

+2

@codaddict: Dostałeś to. –

+0

w jaki sposób rekurencyjnie [z warunkiem] stosowałbyś to do wszystkich plików w folderze? np .: 'dla wszystkich podfolderów/plików w. : jeśli plik to * .c, to SED_CMD' ?? – bny

8

Niestety aby zużyć całą odpowiedź - właśnie ze względu na formatowanie :) W zasadzie taką samą odpowiedź od @tangens, ale bez pliku tymczasowego:

echo "$(cat header.txt sample.txt)" > sample.txt 

Note cytaty ("), aby zachować zakończenia linii i fakt, że konkatenacja cat działa w podprocesie - więc nie powinno być możliwości nadpisania pliku (sample.txt), który jest otwarty do czytania ..

Pozdrawiam!

Powiązane problemy