Nowe posty

xx Problem z Linux Lite po instalacji (1)
Dzisiaj o 15:19:31
xx Dystrybucja pod HP Omen (7)
Dzisiaj o 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Wstawianie tekstu w konkretnym miejscu.  (Przeczytany 2974 razy)

TheBocios

  • Gość
Wstawianie tekstu w konkretnym miejscu.
« dnia: 2012-05-03, 12:09:24 »
Witam, pisze skrypt i mam przerastający mnie problem. Mianowicie muszę wstawić w plik tekstowy w odpowiednim miejscu kawałek tekstu wygenerowany przez pętle. Może to być z pliku. Ale teraz jak to zrobić aby to było w odpowiedniej linii, na przykład pod zmienna $n jest linia od której ma byś wstawiony tekst. A musi on być wklejony a nie nadpisany na końcu.
Próbowałem robić to za pomocą sed-a ale ja muszę stawić wygenerowane zmienne a nie da się w sed-dzie zrobić żeby wstawiał zmienna zamiast na sztywno wprowadzonego tekstu.

Jakieś sugestie?

  • Gość
Wstawianie tekstu w konkretnym miejscu.
« Odpowiedź #1 dnia: 2012-05-03, 13:33:48 »
Cytat: TheBocios
Próbowałem robić to za pomocą sed-a ale ja muszę stawić wygenerowane zmienne a nie da się w sed-dzie zrobić żeby wstawiał zmienna zamiast na sztywno wprowadzonego tekstu.

Jakieś sugestie?
1. Używać podwójnych cudzysłowów zamiast pojedynczych. W dokumentacji powłoki poczytać o cytowaniu (QUOTING) i przetwarzaniu wiersza poleceń (EXPANSION).
2. W poście umieszczać już stworzony kod, który nie działa. Choćby po to aby udowodnić, że faktycznie już się samemu coś zrobiło.

$ cat test 
1
2
3
4
5
$ n=2
$ var="ojej, to nie pasuje"
$ sed -e "/$n/s:\\$:\\n$var:gi" test # za zmienną n wstawi zawartość zmiennej var
1
2
ojej, to nie pasuje
3
4
5
$ sed -e "4 i $var" test # zmienną var wstawi w 4 wierszu pliku, kolejne wiersze zostaną "przesunięte" w dół
1
2
3
ojej, to nie pasuje
4
5

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Wstawianie tekstu w konkretnym miejscu.
« Odpowiedź #2 dnia: 2012-05-03, 13:43:00 »
Pochwal się co zrobiłeś z tym sedem. Nie rozumiem czemu nie możesz użyć w sedzie zmiennej.

Generalnie pliku "w miejscu" nie można zedytować. Albo musisz zapisać nową zawartość w pamięci i na koniec wypluć do tego samego pliku zastępując jego zawartość, albo (jeśli operujesz na dużej ilości danych, które niebezpiecznie zapchałyby pamięć) użyć pliku tymczasowego a potem nadpisać nim plik docelowy.

Z użyciem sed:
#!/bin/sh
file="plik.txt"
line="dodaj mnie"
n=3

sed "${n}a${line}" "$file" > "${file}.tmp"
mv -f "${file}.tmp" "${file}"
Albo, jeśli używasz seda z GNU, jest tam opcja -i czyli --in-place:
#!/bin/sh
file="plik.txt"
line="dodaj mnie"
n=3

sed -i "${n}a${line}" "$file"
Możesz też użyć head i tail:
#!/bin/sh
file="plik.txt"
line="dodaj mnie"
n=3

head -n $n "${file}" > "${file}.tmp"
echo "$line" >> "${file}.tmp"
n=$(($n+1))
tail -n +$n "${file}" >> "${file}.tmp"
mv -f "${file}.tmp" "${file}"
Albo head i tail w pamięci:
#!/bin/sh
file="plik.txt"
line="dodaj mnie"
n=3

C=`head -n $n "${file}"`
C="${C}\\n${line}"
n=$(($n+1))
C="${C}\\n$(tail -n +$n ${file})"
echo "$C" > "${file}"

TheBocios

  • Gość
Wstawianie tekstu w konkretnym miejscu.
« Odpowiedź #3 dnia: 2012-05-03, 14:33:48 »
O kurcze poczekajcie muszę pokombinować i zobaczyć czy działa bo na razie to mam natłok informacji :P
Dobra działa tylko jeszcze muszę poszukać jak zrobić żeby pętla zmniejszała a nie zwiększała wartości po każdym przejściu.
ilosc_plikow=9
numer_lini=14
for j in `seq 1 $ilosc_plikow`
do
r="v r$j"
sed -i "${numier_lini} a\\ ${r}" projekt.pto
p="v p$j"
sed -i "${numier_lini} a\\ ${p}" projekt.pto
y="v y$j"
sed -i "${numier_lini} a\\ ${y}" projekt.pto
X="v TrX$j"
sed -i "${numier_lini} a\\ ${X}" projekt.pto
Y="v TrY$j"
sed -i "${numier_lini} a\\ ${Y}" projekt.pto
Z="v TrZ$j"
sed -i "${numier_lini} a\\ ${Z}" projekt.pto
done
v="v"
sed -i "${numier_lini} a\\ ${v}" projekt.pto
Dzięki bardzo za pomoc ;)