Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 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: Wyszukanie danej linii pliku i użycie polecenie SED. Zamiana wartości w pliku.  (Przeczytany 3276 razy)

Szmar

  • Gość
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
  • Prawie jak Guru
  • ****
  • Wiadomości: 402
    • 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: 2763
  • 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 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2763
  • 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 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.