2013-02-01 25 views
8

Mam wymaganie, w którym w potrzebuję zmienić zawartość pliku powiedz xyz.cfg. plik zawiera wartości, takie jak:Zmiana zawartości pliku za pomocą skryptu powłoki

group address=127.8.8.8 
port=7845 
Jboss username=xyz_ITR3 

chcę zmienić zawartość strony, kiedy kiedykolwiek potrzebne przez skrypt powłoki i zapisz plik. Zmieniono treść może wyglądać następująco:

group address=127.8.7.7 
port=7822 
Jboss username=xyz_ITR4 

W jaki sposób można to osiągnąć przy użyciu skrypt przez biorąc dane wprowadzone przez użytkownika lub w inny sposób?

+0

Należy zadać konkretne pytanie do konkretnego problemu. Ponieważ Stack Overflow ukrywa przed Tobą bliskie powody: * "Pytania z prośbą o zalecenie lub znalezienie książki, narzędzia, biblioteki oprogramowania, samouczka lub innych zasobów poza miejscem pracy są nie na temat Stack Overflow, ponieważ mają tendencję do przyciągania opinii i spamu Zamiast tego opisz problem i to, co zostało zrobione do tej pory. "* – jww

Odpowiedz

23

Jak o czymś takim:

#!/bin/bash 

addr=$1 
port=$2 
user=$3 

sed -i -e "s/\(address=\).*/\1$1/" \ 
-e "s/\(port=\).*/\1$2/" \ 
-e "s/\(username=\).*/\1$3/" xyz.cfg 

Gdzie $1,$2 i $3 są argumenty przekazywane do skryptu. Zapisać go do pliku, takie jak script.sh i upewnić się, że plik wykonywalny z chmod +x script.sh następnie można uruchomić go lubię:

$ ./script.sh 127.8.7.7 7822 xyz_ITR4 

$ cat xyz.cfg 
group address=127.8.7.7 
port=7822 
Jboss username=xyz_ITR4 

To daje podstawową strukturę jednak co chcesz myśleć o walidacji wejścia ect.

+1

Działa to idealnie w zależności od potrzeb!dzięki – user2031888

7
sed -i 's/something/other/g' filename.txt 

Will edytować nazwa_pliku.txt w miejscu, i zmienić słowo „coś” do „inne”

myślę -i może być rozszerzenie GNU chociaż, ale jeśli to jest OK dla Ciebie, można dodać go poprzez znalezisku, xargs itp

Jeśli chciałbyś zmienić go w skrypcie powłoki, można wziąć argumenty wiersza polecenia i odnoszą się do nich liczby, na przykład $ 1

Edycja:

Zgodnie z moim komentarzem, odpowiedź sudo_O poniżej jest dokładnie tym, czego potrzebujesz. Dodam tylko, że często powinieneś robić takie dopasowania z wieloma plikami, obejmującymi podkatalogi itd., Więc poznaj find/xargs i możesz połączyć te dwa. Prostym przykładem powiedzenia zmienia podsieć w pęczek plików .cfg mogą być:

find -name '*.cfg' -print0 | xargs -0 -I {} sed -ie 's/\(192.168\)\.1/\1\.7/' {} 

Zanotuj -print0/-0 args znaleźć/xargs (bardzo przydatne do ścieżki/nazwy plików ze spacjami), a musisz uciec przechwytywanie nawiasy powodu powłoki (tak samo w przykładzie sudo'S)

+0

> wraz z pozostałymi liniami mam jeszcze kilka linii, które pozostaną stałe w nowym pliku. Więc jak umieścić tę nową zawartość razem ze starą? – user2031888

+0

Już miałem dodać przykład wzdłuż linii sudo_O's, ale jego odpowiedź jest zgodna; dopasowywanie/przechwytywanie "kluczy", na których Ci zależy, i pozostawianie innych bez zmian – herdingofthecats

8

*

#! /bin/sh 
file=xyz.cfg 
addr=$1 
port=$2 
username=$3 
sed -i 's/address=.*/address='$addr'/' $file 
sed -i 's/port=.*/port='$port'/' $file 
sed -i 's/username=.*/username='$username'/' $file 

*

Mam nadzieję, że ten będzie łatwiejszy do zrozumienia dla początkujących

+0

Dziękuję za to, nigdy nie używano sed wcześniej i nie miałem pojęcia, co się dzieje w zaakceptowanej odpowiedzi –

Powiązane problemy