Bir anahtar, değer çiftleri içeren bir yapılandırma dosyasını değiştirmek için bir bash komut dosyası yazıyorum. Anahtarı nasıl okuyabilirim ve değeri nasıl bulabilirim?bash betiğini kullanarak yapılandırma dosyasını değiştir
cevap
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
-c çevremde geçersiz görünüyor. -C'den kurtulduğumda işe yarıyor. Teşekkürler. –
'-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
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
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
, 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
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
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
emin ol. Bu yüzden 'hata denetimi ekle' yazdım :) –
=
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?)"
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile
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
- 1. Kabuk betiğini kullanarak zip dosyası nasıl oluşturulur?
- 2. dağıtımda erb dosyasını değiştir
- 3. Tüm yapılandırma dosyasını şifreleyebilir miyiz?
- 4. php taksitli bash dosyasını tanıyın
- 5. bash
- 6. Yapılandırma komut dosyasını nasıl oluştururum?
- 7. SLES - Gnome - Komut dosyasını kullanarak masaüstü arka planını değiştir
- 8. Kabuk betiğini kullanarak dos2unix nasıl otomatikleştirilir?
- 9. git bash ile kullanıcı ve parola yapılandırma
- 10. bash ile knitr: çalışma dizinini değiştir
- 11. Güncelleme \ Android'de bir XML dosyasını değiştir
- 12. Aygıtı algıla ve CSS dosyasını değiştir - jQuery
- 13. Getopts (bash) kullanarak çoklu seçenek argümanları (bash)
- 14. Windows'taki yapılandırma - yapılandırma dosyası
- 15. yapılandırma dosyasını scala jar dosyasına geçirme
- 16. Bir Visual Studio Paketi'nde yapılandırma dosyasını değiştirme
- 17. Git - yapılandırma dosyasını kaldırın ve dışarıda bırakın
- 18. Yapılandırma dosyasını dosya yerine akımdan yükle
- 19. include_path veya her php dosyasını değiştir
- 20. Değiştir CXF
- 21. Doc görevini kullanarak scaladoc oluşturduktan sonra bash betiği nasıl çalıştırılır?
- 22. Powershell komutunu kullanarak komut dosyasını fileanme kullanarak veya komut dosyasını
- 23. php komut dosyasını kullanarak sunucuda ayar zamanı
- 24. Birlik diğer GameObject betiğini bulamıyor
- 25. Dinamik SQL kullanarak yapılandırma tabloları
- 26. Simple Groovy, regex kullanarak değiştir
- 27. Javascript kullanarak düzeltme değiştir regex
- 28. scala.sys.process kullanarak bash dizelerini yürütme
- 29. BASH - kullanarak tuzak ctrl + c
- 30. PowerShell betiğini kullanarak Performans İzleyicisi'nden e-posta uyarısı gönder
Bu değeri burada yerini almayacak https://stackoverflow.com/a/47509618/3343801 –