Nowe posty

Autor Wątek: Wyszukanie danej linii pliku i użycie polecenie SED. Zamiana wartości w pliku.  (Przeczytany 292 razy)

Offline Mateusz Szymański

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 1
    • Zobacz profil
Cześć.

Jestem w trakcie tworzenia skryptu, który ma za zadanie automatycznie po odpaleniu z parametrami w kilku plikach konfiguracyjnych zmienić odpowiednie wartości ID itd. Wymyśliłem sobie, żeby podmienić wartości w pliku użyję polecenie sed i wstawię do niego polecenie wyszukania linii, której numer będę znał:

W uproszczeniu składnia sed bez parametrow:

sed '/ tekst do nadpisania / wartość która ma być wstawiona'  nazwa pliku

tekst do nadpisania - tutaj sed po wpisaniu tekstu wyszukuje w pliku to co wpisaliscie w polecenie i przygotowuje do nadpisania

Chciałem to zamienić w ten sposób aby zamiast wyszukiwanej po tekscie wpisać polecenie i wypisać od razu całą linie do podmienienia np. head plik | tail plik, które nie działa. Ewentualnie użyć polecenia grep które niestety również nie działa w środku polecenia sed :/

Polecenie, które działa:

sed -i -e 's/'$(head -1 /etc/plikkonf)'/blablabal'$1'/g' /etc/plikkonf

Polecenie, które dla przykładu nie działa:

sed -i -e 's/'$(grep sdsdsdsds /etc/plikkonf)'/ bblablablalbalbl'$2'/g' /etc/plikkonf     #tutaj myslałem grep zamienić na head plik | tail plik

Czy ma ktokolwiek pomysł jak rozwiązać ten problem? Może po prostu jest inne wyjście w tej sytuacji niż polecenie sed.

Pozdrawiam Serdecznie :)

Offline marcin'82

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 221
    • Zobacz profil
Cytuj
Czy ma ktokolwiek pomysł jak rozwiązać ten problem?

Bez pokazania konkretnego pliku czy linii i napisania co chcesz zamienić i na co się nie obejdzie.
marcin82

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 1947
  • 1709
    • Zobacz profil
1. Head
Cytuj
head plik | tail plik, które nie działa
Nie wiem co chciałeś przez to osiągnąć.
- Jak dla mnie shakowales head, tym
head -1 /etc/plikkonf
bo np. w
$ head --help
Usage: head [OPTION]... [FILE]...
Print the first 10 lines of each FILE to standard output.
...
u mnie nie pisze ze można podać liczbę zamiast opcji.
:D Ale fakt faktem działa.
- Jesli poczytasz dokladniej "head --help" to bedziesz mogl np zrobic
$ head -n 2 conf | tail -n 1
SystemGroup
Czyli head wyswietli 2 piersze linie , a potem tail wyswietli z poprzedniego wyniku  jedna linie od konca.


2. Grep
Kiedy uzywasz grep mozesz otrzymać kilka linii,
Natomiast ty potrzebujesz otrzymać konkretna linie do podmiany.
Cytuj
$ grep Listen plik
Listen *:@DEFAULT_IPP_PORT@
Listen localhost:@DEFAULT_IPP_PORT@

Jeśli chcesz podmieniac cale linie ktore zawieraja dane slowo,
to moglbys najpierw je wyszukac, a potem w petli uzyc sed.

Teoretyczny przyklad tylko
LISTA_LINI=$(grep sdsdsdsds /etc/plikkonf)
LICZBA_LINI=$(grep sdsdsdsds /etc/plikkonf | wc -l)

for i in `seq 1 $LICZBA_LINI`
do
LINIA_KOLEJNO=$(awk 'NR=='$i <<< "$LISTA_LINI")
sed -i -e "s/${LINIA_KOLEJNO}/blablabal${1}/g" /etc/plikkonf
done

PS: Kod troche sie na forum rozjechal,
mam na mysli ze komendy w nawiasach ( ) sa w jednej linii.


3. Drobne rady:
- Jesli beda Cie denerwowac  ' ' ' ' to zamiast tego mozesz sprobowac uzyc " "
- Jesli  bedzie problem ze znalezieniem zmiennej
 $ZMIENNAjuznie , mozesz zapisac ${ZMIENNA}juznie
- Mozesz dodac wlasne debugowanie
# Debugowanie wlaczyc "on" , wylaczyc "off" 
DEBUG0="on"

function DEBUG()
{
[ "$DEBUG0" == "on" ] &&  $@
}

ZMIENNA="12"
DEBUG echo "Jesli wlaczone debugowanie wyswietli zmienna $ZMIENNA"
Oczywiscie do skryptu mozesz sobie zbudowac wlasny --help i tam dodac debugowanie.

« Ostatnia zmiana: 2018-07-05, 13:04:49 wysłana przez 1709 »
Pochwal się swoją kartą graficzną w tym wątku-->
http://forum.linux.pl/index.php/topic,19841.msg121122.html#msg121122

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 1947
  • 1709
    • Zobacz profil
Zamiast pętli możesz jeszcze użyć wyrażenia regularnego
https://www.tutorialspoint.com/unix/unix-regular-expressions.htm

Czyli na podstawie tego poradnika teoretycznie by wyglądało tak
sed -e "s/^sdsdsdsds.*$/blablabal${1}/" /etc/plikkonf
- Ta komenda podmieni tylko te linie zaczynajace sie na sdsdsdsds.
Jesli w srodku wystapi sdsdsdsds, to tego nie ruszy (zrobilem to celowo).
- Jesli bys chcial podmienic wszystko co zawiera sdsdsdsds
sed -e "s/^.*sdsdsdsds.*$/blablabal${1}/" /etc/plikkonf

Dla pewności przetestuj co Ci najbardziej odpowiada i z rożnymi przypadkami. (zeby Ci czegoś ważnego nie podmieniło)
:)
« Ostatnia zmiana: 2018-07-06, 11:45:46 wysłana przez 1709 »
Pochwal się swoją kartą graficzną w tym wątku-->
http://forum.linux.pl/index.php/topic,19841.msg121122.html#msg121122