Nowe posty

Autor Wątek: SED - dodanie tekstu w pliku  (Przeczytany 4067 razy)

rysic

  • Gość
SED - dodanie tekstu w pliku
« dnia: 2014-05-30, 09:41:11 »
Nie jestem dobry w programowaniu, ale z tego co wygooglałem, to udało mi się utworzyć prosty skrypcik, który wyszukuje odpowiednie miejsce w pliku i dodaje nowy wpis po wyszukanym wzorcu.

ssh ${user}@srv.domena -t "sed '/^#-* *$country_big *-*/ a\\'$srv /etc/p/a.conf > ~/a_new.conf; cat ~/a_new.conf > /etc/p/a.conf; rm ~/a_new.conf"
Zauważyłem, że sama komenda wypluwa zmieniony odpowiednio plik, więc wrzucam do wyjście do tymczasowego pliku a następnie nadpisuję oryginalny. Nie podoba mi się jednak takie podejście, bo wydaje mi się trochę groźne i zbyt skomplikowane - jakieś kasowanie plików, nadpisywanie oryginalnego - jest gdzie po drodze coś spartolić i przypadkiem popsuć konfigurację.

Czy da się tak użyć komendy SED aby wrzucała do pliku nowy wiersz, nie tworząc nowego pliku?

Przy okazji, fajnie byłoby, gdyby SED też sortował to co wstawia, ale jak to ugryźć to nie mam pojęcia. W tej chwili zachowuje się on tak. Ma sobie plik:

#---wzor1---
x
z
s
#---wzor2--
2
4
6
8

i ma wstawic 7 po wzor2, wiec robi cos takiego:


#---wzor1---
x
z
s
#---wzor2--
7
2
4
6
8

ale fajnie byłoby, gdyby robił to w ten sposób:

#---wzor1---
x
z
s
#---wzor2--
2
4
6
7
8

Da się to jakoś w prosty sposób zrobić w SED?
Z góry dziękuję za wszystkie podpowiedzi! :-)

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
SED - dodanie tekstu w pliku
« Odpowiedź #1 dnia: 2014-05-30, 17:49:36 »
sed
-i, --in-place

Sortowanie to albo sort, ale wtedy musisz wyciąć interesujący Cię fragment, posortować i złożyć plik z powrotem.
Albo ewentualnie awk, ale z nim będzie sporo rzeźbienia.

Z innej beczki:
cat ~/a_new.conf > /etc/p/a.conf; rm ~/a_new.conf
A może by tak po prostu:
mv -f ~/a_new.conf /etc/p/a.conf
?

xavery

  • Gość
SED - dodanie tekstu w pliku
« Odpowiedź #2 dnia: 2014-06-05, 13:30:16 »
Cytat: ultr
sed
-i, --in-place
Założeniem było nie tworzenie nowego pliku a sed -i jak najbardziej tworzy nowy plik w miejsce edytowanego, oczywiście z tą samą nazwą:). To naturalnie szczegół ale czasami ważny bo nowy plik powstaje z nowymi prawami/właścicielstwem/i-nodem. Szczególnie widoczne staje się to w środowisku Cygwin.
Aby mieć pewność, że edytowany plik pozostanie tym samym plikiem używam zwykłego ed'a. Np tak:

$ cat >plik
raz
dwa
trzy
$ cat plik
raz
dwa
trzy
$ \\ls -i plik
12763137 plik
$ echo -e ',g/dwa/a\\\\\\npięć\\n.\\nwq\\n' | ed - plik
pięć
$ cat plik
raz
dwa
pięć
trzy
$ \\ls -i plik
12763137 plik