[+] Bash - polecenie sed (jak użyć zmiennych?)

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
axel.ziom
Posty: 22
Rejestracja: 10 kwietnia 2011, 20:18
Lokalizacja: Kutno

[+] Bash - polecenie sed (jak użyć zmiennych?)

Post autor: axel.ziom »

Witam, potrzebuję pomocy nieco z napisaniem skryptu. Potrzebuję wyciagnąć pierwszą linię z pliku dhcpd.conf i wpisać ją do zmiennej. Następnie za pomocą inputbox chcę pobrać dane od użytkownika, aby starą zmienną "x" zamienić nową zmienną "inout". Nie wiem dlaczego, ale nie przechodzi mi polecenie sed zapisane w ostatniej linijce. Cały czas otrzymuję błąd:
sed: -e wyrażenie #1, znak 0: brak poprzedniego wyrażenie regularnego

Kod: Zaznacz cały

x = `sed -n 1p /etc/dhcp/dhcpd.conf`
dialog --title "wprowadz nowa wartosc" --backtitle "program" --inputbox "wprowadz wartosc" 7 60 2>temp
inout = $(cat temp)
sed -i "s/${x}/${inout}/g" /etc/dhcp/dhcpd.conf 
Zrobiłem mały test. Kiedy dodałem kod jak poniżej, wtedy się udało. Podstawiło string na zmienną inout.

Kod: Zaznacz cały

sed -i "s/tekst_szukany/${inout}/g" /etc/dhcp/dhcpd.conf 
Jednak nadal gdy próbuję podstawić zmienną na zmienną otrzymuję błąd.

Bardzo proszę o pomoc.
Ostatnio zmieniony 21 sierpnia 2016, 21:47 przez axel.ziom, łącznie zmieniany 1 raz.
Awatar użytkownika
dedito
Moderator
Posty: 3560
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Bash - polecenie sed (jak użyć zmiennych?)

Post autor: dedito »

Po co definiujesz zmienną inout skoro masz ją w temp?
Nie prościej "kazać" sed pobrać linijkę z temp?
Awatar użytkownika
axel.ziom
Posty: 22
Rejestracja: 10 kwietnia 2011, 20:18
Lokalizacja: Kutno

Re: Bash - polecenie sed (jak użyć zmiennych?)

Post autor: axel.ziom »

Też racja, jednak zmienna inout działa prawidłowo. Problem jest ze zmienną x, a dokładniej z zapisem sed. Przekopałem całe google, napisałem kilkadziesiąt kombinacji z tego co znalazłem.. i niestety nic.
Awatar użytkownika
dedito
Moderator
Posty: 3560
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Bash - polecenie sed (jak użyć zmiennych?)

Post autor: dedito »

A spróbowałeś tak:

Kod: Zaznacz cały

x = $(sed -n 1p /etc/dhcp/dhcpd.conf)
?
Awatar użytkownika
axel.ziom
Posty: 22
Rejestracja: 10 kwietnia 2011, 20:18
Lokalizacja: Kutno

Re: Bash - polecenie sed (jak użyć zmiennych?)

Post autor: axel.ziom »

Tak, rezultat ten sam. Zabrakło mi już pomysłów. Najlepsze jest to, że string wchodzi normalnie, dlatego dziwi mnie to, że po wstawieniu zmiennej w wyrażenie szukane występuje błąd.
A masz może jakiś pomysł jak podstawić za pomocą innego narzędzia zmienną na zmienną w pliku ?
Awatar użytkownika
dedito
Moderator
Posty: 3560
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Bash - polecenie sed (jak użyć zmiennych?)

Post autor: dedito »

A co zwróci polecenie:

Kod: Zaznacz cały

echo ``x = $(sed -n 1p /etc/dhcp/dhcpd.conf)``
Nie pisz posta pod poste. Używaj edycji.
Awatar użytkownika
axel.ziom
Posty: 22
Rejestracja: 10 kwietnia 2011, 20:18
Lokalizacja: Kutno

Re: Bash - polecenie sed (jak użyć zmiennych?)

Post autor: axel.ziom »

Udało się :)

Kod: Zaznacz cały

sed -i "s/$(sed -n 1p /etc/dhcp/dhcpd.conf)/${inout}/g" /etc/dhcp/dhcpd.conf
Dziękuję za wskazówkę. Wreszcie mogę dopracować skrypcik.

DZIĘKUJĘ! Można zamykać.
Awatar użytkownika
dedito
Moderator
Posty: 3560
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Bash - polecenie sed (jak użyć zmiennych?)

Post autor: dedito »

Oznacz wątek zgodnie z regulaminem.
Awatar użytkownika
lizard
Beginner
Posty: 287
Rejestracja: 08 lutego 2016, 18:47

Re: Bash - polecenie sed (jak użyć zmiennych?)

Post autor: lizard »

Po pierwsze, co zawierają zmienne $x i $inout? Jeśli jest w nich '/', to sed głupieje. Jakiej wartości spodziewasz się w zmiennej $x?

Jeśli chcesz zmienić tylko pierwszą linię w pliku, to proponuję skorzystać z tail:

Kod: Zaznacz cały

dialog --title "wprowadz nowa wartosc" --backtitle "program" --inputbox "wprowadz wartosc" 7 60 2>temp
tail -n+2 /etc/dhcp/dhcpd.conf | cat test - > /etc/dhcp/dhcpd.conf
Aby zmienić wszystkie linie identyczne z pierwszą spróbuj tego:

Kod: Zaznacz cały

sed -e "/${x}/c\\${inout}" /etc/dhcp/dhcpd.conf
Awatar użytkownika
axel.ziom
Posty: 22
Rejestracja: 10 kwietnia 2011, 20:18
Lokalizacja: Kutno

Re: [+] Bash - polecenie sed (jak użyć zmiennych?)

Post autor: axel.ziom »

Dla zmiennej $x jest wycięta linia:

Kod: Zaznacz cały

subnet 10.0.2.0 netmask 255.255.255.0
Co do zmiennej $inout, będzie to nowa wartość dla podsieci i maski sieciowej.

Muszę zrobić test również z tail, zgodnie z tym co mi poleciłeś.

Dziękuję.
Zablokowany