2011-12-22 17 views
11

Il titolo dice tutto. Ho bisogno di sostituire un valore di proprietà che non conosco con un valore diverso. sto cercando questo:Modificare un valore di proprietà in un file di proprietà dallo script di shell

#!/bin/bash 
sed -i "s/myprop=[^ ]*/myprop=$newvalue/g" file.properties 

ottengo sed: -e expression #1, char 19: unknown option to s'`

Credo che il problema è che $newvalue è una stringa che rappresenta una directory in modo che scombina sed.

Cosa posso fare?

+3

'/' è solo il solito (ma non obbligatorio) delimitatore per 'sed'. Cosa succede se provi qualcos'altro, come pipe ('|')? –

+0

@DanFego ha funzionato! mi ci è voluto molto per capire che il '/' nella mia stringa var era il problema. Ho dimenticato che puoi cambiare il delimitatore di sed. grazie – Michael

+1

Perché usi il modificatore 'g'? – fge

risposta

7

sed può utilizzare caratteri diversi da / come delimitatore, anche se / è il più comune. Quando si ha a che fare con cose come i nomi di percorso, è spesso utile usare qualcosa come pipe (|).

+0

per alcuni sed è necessario 'sfuggire' alla prima istanza di un delimitatore di reg-es non standard, come 's \ | srch | repl |'. Buona fortuna a tutti. – shellter

7

Se il file proprietà è delimitato con = segno come questo -

param1=value1 
param2=value2 
param3=value3 

quindi è possibile utilizzare awk non modifiy il valore param semplicemente conoscendo il nome param. Per esempio, se vogliamo modificare il param2 nel file di proprietà, siamo in grado di effettuare le seguenti operazioni -

awk -F"=" '/param2/{$2="new value";print;next}1' filename > newfile 

Ora, quanto sopra one-liner richiede di codificare il nuovo valore del parametro. Questo potrebbe non essere il caso se lo stai usando in uno script di shell e hai bisogno di ottenere il nuovo valore da una variabile.

In tal caso, è possibile effettuare le seguenti operazioni -

awk -F"=" -v newval="$var" '/param2/{$2=newval;print;next}1' filename > newfile 

In questo ci consente di creare una variabile awknewval e inizializzarla con la variabile di script ($ var) che contiene il nuovo valore del parametro.

+0

Cosa succede se voglio aggiungere una nuova riga alla fine se la proprietà non esiste? –

+0

Ho provato il comando 'awk', ma esso rimuove il file' = 'dall'output, quindi converte' HOSTNAME = oldvalue' in 'HOSTNAME newvalue' - Qualche idea su cosa ho sbagliato? –

+1

@Oly Avrai bisogno di impostare la variabile OFS. Quindi 'awk -F '=' -v OFS = '=' ...' –

0

Ho trovato una funzione da qualcuno chiamato Kongchen. Ha scritto uno script funzione per modificare i valori delle proprietà e ha funzionato bene per me:

Check it out: https://gist.github.com/kongchen/6748525

Problemi correlati