2010-03-17 19 views

cevap

72

tek değerini değiştirerek karanlıkta vahşi bıçak: hedef anahtarı ve değiştirme varsayarak

sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE 

değer, özel normal ifade karakterleri içermez ve anahtar/değer ayırıcınız "=". Not, -c seçeneği sisteme bağımlıdır ve çalıştırılmak üzere sed için çıkarmanız gerekebilir.

Benzer değişikliklerin nasıl yapılacağıyla ilgili diğer ipuçları için (örn. REPLACEMENT_VALUE içinde '/' karakterleri olduğunda), there are some great examples here.


cat "$FILE" | grep "^${KEY}${DELIMITER}" | cut -f2- -d"$DELIMITER" 

Böyle bir şey yapabileceğini güncellemek için: Bu KEY- sırasını korumak olmaz


mv "$FILE" "$FILE.bak" 
cat "$FILE.bak" | grep -v "^${KEY}${DELIMITER}" > "$FILE" 
echo "${KEY}${DELIMITER}${NEWVALUE}" >> "$FILE" 

genelde

+7

-c çevremde geçersiz görünüyor. -C'den kurtulduğumda işe yarıyor. Teşekkürler. –

+0

'-c' seçeneği, dosyayı karıştırdıklarında (dosyayı yeniden adlandırmak yerine) kopyalamak için sed'e söyler - bu, sahiplenmeyi ve salt okunur dosyalarla uğraşmayı engeller. Kendimi aptal hatalardan kurtarmak için aldığım alışkanlıklardan biri (özellikle “bul ... | xargs sed -i” ile). – Cascabel

+1

Bu cevap için iki indirimi gerçekten aldım mı? Sadece OP'nin ne istediğini tahmin etmeyi başaramadım, kısa ve verimli. Açıklamak isteyen var mı? – Cascabel

-1

sizin yapılandırma dosyası formatında altında olduğunu varsayalım: sizin bash komut dosyasında

CONFIG_NUM=4 
CONFIG_NUM2=5 
CONFIG_DEBUG=n 

, şunları kullanabilirsiniz:

$CONFIG_NUM

CONFIG_FILE=your_config_file 
. $CONFIG_FILE 

if [ $CONFIG_DEBUG == "y" ]; then 
    ...... 
else 
    ...... 
fi 

, $CONFIG_NUM2, $CONFIG_DEBUG ne ihtiyaç vardır. senin after

geri kolay olacak yazma değerlerini okuyun:

echo "CONFIG_DEBUG=y" >> $CONFIG_FILE 
+6

, sadece altta yeniden eklemek cevap çalıştı, o varlık yapılandırma dosyasında tamamen bağımlı olduğunu geçerli bir bash betiği ve ... vay, yapılandırma dosyasında kötü amaçlı bir şey varsa ne olur? – Cascabel

1

o grep ile bilgi ayıklamak ve kesmek kolaydır Açıkça değer çiftleri. Verilerinizi kaybetmediğinizden emin olmak için hata kontrolü ekleyin. Eğer key=value çiftlerinin bir dosya bu

+0

Eğer disk alanınız biterse veya herhangi bir sebepten dolayı 'FILE' yaratamazsanız, çözümünüz' FILE' bırakmayacaktır (biri FILE.bak’i '' FILE''e geri döndürmek zorunda kalacaktır. – vladr

+0

emin ol. Bu yüzden 'hata denetimi ekle' yazdım :) –

0

= etrafında boşluk ile potansiyel olarak varsayarak, silebilir, modifiye yerinde ya da anahtarlar veya değerler özel normal ifade sekanslar ihtiva bile awk kullanılarak istenirse anahtar değer çiftlerini ekleyin:

# Using awk to delete, modify or append keys 
# In case of an error the original configuration file is left intact 
# Also leaves a timestamped backup copy (omit the cp -p if none is required) 
CONFIG_FILE=file.conf 
cp -p "$CONFIG_FILE" "$CONFIG_FILE.orig.`date \"+%Y%m%d_%H%M%S\"`" && 
awk -F '[ \t]*=[ \t]*' '$1=="keytodelete" { next } $1=="keytomodify" { print "keytomodify=newvalue" ; next } { print } END { print "keytoappend=value" }' "$CONFIG_FILE" >"$CONFIG_FILE~" && 
mv "$CONFIG_FILE~" "$CONFIG_FILE" || 
echo "an error has occurred (permissions? disk space?)" 
2
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile 
10

Umut bu kimse yardımcı olur. Kendi türünde bir betik oluşturdum, bu da çeşitlerin işlenmesini gerektiriyordu.

#!/bin/bash 
CONFIG="/tmp/test.cfg" 

# Use this to set the new config value, needs 2 parameters. 
# You could check that $1 and $1 is set, but I am lazy 
function set_config(){ 
    sudo sed -i "s/^\($1\s*=\s*\).*\$/\1$2/" $CONFIG 
} 

# INITIALIZE CONFIG IF IT'S MISSING 
if [ ! -e "${CONFIG}" ] ; then 
    # Set default variable value 
    sudo touch $CONFIG 
    echo "myname=\"Test\"" | sudo tee --append $CONFIG 
fi 

# LOAD THE CONFIG FILE 
source $CONFIG 

echo "${myname}" # SHOULD OUTPUT DEFAULT (test) ON FIRST RUN 
myname="Erl" 
echo "${myname}" # SHOULD OUTPUT Erl 
set_config myname $myname # SETS THE NEW VALUE 
İlgili konular