Mam na myśli użycie sed do odczytu pliku .properties, ale zastanawiałem się, czy istnieje lepszy sposób na zrobienie tego ze skryptu Bash?Czytanie pliku java .properties z bash
Odpowiedz
Wymienione wyżej rozwiązania będą działały na podstawach. Myślę jednak, że nie obejmują one wartości wielowierszowych. Oto program awk, który będzie analizować właściwości Javy ze standardowego wejścia i wytwarzają zmienne środowiskowe, na standardowe wyjście:
BEGIN {
FS="=";
print "# BEGIN";
n="";
v="";
c=0; # Not a line continuation.
}
/^\#/ { # The line is a comment. Breaks line continuation.
c=0;
next;
}
/\\$/ && (c==0) && (NF>=2) { # Name value pair with a line continuation...
e=index($0,"=");
n=substr($0,1,e-1);
v=substr($0,e+1,length($0) - e - 1); # Trim off the backslash.
c=1; # Line continuation mode.
next;
}
/^[^\\]+\\$/ && (c==1) { # Line continuation. Accumulate the value.
v= "" v substr($0,1,length($0)-1);
next;
}
((c==1) || (NF>=2)) && !/^[^\\]+\\$/ { # End of line continuation, or a single line name/value pair
if (c==0) { # Single line name/value pair
e=index($0,"=");
n=substr($0,1,e-1);
v=substr($0,e+1,length($0) - e);
} else { # Line continuation mode - last line of the value.
c=0; # Turn off line continuation mode.
v= "" v $0;
}
# Make sure the name is a legal shell variable name
gsub(/[^A-Za-z0-9_]/,"_",n);
# Remove newlines from the value.
gsub(/[\n\r]/,"",v);
print n "=\"" v "\"";
n = "";
v = "";
}
END {
print "# END";
}
Jak widać, wartości obsługujący kilka linii uczynić to bardziej skomplikowane. Aby zobaczyć wartości właściwości w skorupkach, tylko źródło na wyjściu: „”
cat myproperties.properties | awk -f readproperties.awk > temp.sh
source temp.sh
Zmienne będą miały „_” w miejscu, więc some.property nieruchomość będzie some_property w skorupkach.
Jeśli masz pliki właściwości ANT, które mają interpolację właściwości (np. "$ {Foo.bar}"), to zalecamy użycie Groovy z AntBuilder. Jest to my wiki page on this very topic.
Poprawiłem błąd w skrypcie, gdy wartość wielowierszowa jest ostatnią definicją i kończy się pustą linią – Toote
W Perl:
while(<STDIN>) {
($prop,$val)=split(/[=: ]/, $_, 2);
# and do stuff for each prop/val
}
nie testowano, i powinien być bardziej tolerancyjne wiodącym/spacje, komentarze itd, ale masz pomysł. To czy korzystasz z Perla (lub innego języka) ponad sed
jest naprawdę zależne od tego, co chcesz zrobić z właściwościami po ich sparsowaniu z pliku.
Zwróć uwagę, że (jak zaznaczono w komentarzach) pliki właściwości Java mogą mieć multiple forms of delimiters (chociaż nie widziałem niczego używanego w praktyce poza dwukropkami). Dlatego podział wykorzystuje wybór postaci do podziału.
Ostatecznie, może być lepiej wyłączyć za pomocą modułu Config::Properties w Perl, który jest zbudowany, aby rozwiązać ten problem.
To niekoniecznie musi działać. Klucze i wartości pliku właściwości można podzielić spacjami, znakiem = lub znakiem: (mogą być również inne sposoby). Sądzę, że możesz także mieszać i dopasowywać używane ograniczniki w jednym pliku właściwości. –
@Thomas - zauważyć. Chociaż w praktyce nie przypominam sobie, by widziałem coś innego niż dwukropki. –
Mam niektóre shell scripts, które muszą wyszukać niektóre właściwości i użyć ich jako argumentów dla programów, których nie napisałem. Sercem skryptu jest linia tak:
dbUrlFile=$(grep database.url.file etc/zocalo.conf | sed -e "s/.*: //" -e "s/#.*//")
Skutecznie, to grep na klucz i odfiltrować rzeczy przed dwukropkiem i po każdym hash.
Jeśli chcesz użyć sed do analizowania pliku -Wszelkie- .properties, może skończyć się z dość skomplikowane rozwiązanie, ponieważ format pozwala podziały wiersza, nie notowanych ciągi, Unicode, itp: http://en.wikipedia.org/wiki/.properties
jeden możliwy Obejście spowodowałoby użycie samego java do wstępnego przetworzenia pliku .properties w coś przyjaznego dla bashu, a następnie wygenerowania go. Np .:
plik .properties:
line_a : "ABC"
line_b = Line\
With\
Breaks!
line_c = I'm unquoted :(
zostanie przekształcony:
line_a="ABC"
line_b=`echo -e "Line\nWith\nBreaks!"`
line_c="I'm unquoted :("
oczywiście, że przyniesie gorsze osiągi, ale wdrożenie byłoby prostsze/jaśniejszy.
'line_b = $ 'Linia \ nZ \ nBreaks!' ' –
Dennis, to nie działa jakoś: http://pastebin.com/m503047e8. Czy czegoś brakuje? – PaoloVictor
Jedną z opcji jest napisanie prostego programu Java, aby zrobić to za Ciebie - następnie uruchom program Java w swoim skrypcie. To może wydawać się głupie, jeśli czytasz właściwości tylko z jednego pliku właściwości. Jednak staje się to bardzo przydatne, gdy próbujesz uzyskać wartość konfiguracji z konfiguracji podobnej do Commons Commons: CompositeConfiguration
wspieranej przez pliki właściwości. Przez pewien czas udawało nam się wdrożyć to, czego potrzebowaliśmy w naszych skryptach powłoki, aby uzyskać to samo zachowanie, które otrzymywaliśmy od CompositeConfiguration
. Potem rozwialiśmy się i zdaliśmy sobie sprawę, że powinniśmy po prostu pozwolić, aby praca nam została wykonana! Nie oczekuję, że będzie to popularna odpowiedź, ale mam nadzieję, że okaże się przydatna.
jeśli chcesz użyć "powłoki", najlepszym narzędziem do parsowania plików i odpowiedniej kontroli programowania jest (g) awk. Użyj tylko sed podstawiania.
Czasami przesyłam plik właściwości do skryptu bash. Spowoduje to ustawienie w skrypcie zmiennych środowiskowych z nazwami i zawartością z pliku. Może to też wystarczy dla ciebie. Jeśli musisz zrobić "prawdziwą" analizę, oczywiście nie jest to droga do zrobienia.
Hmm, właśnie dzisiaj napotkam ten sam problem. Jest to rozwiązanie biedaka, co prawda bardziej prosta niż mądry;)
decl=`ruby -ne 'puts chomp.sub(/=(.*)/,%q{="\1";}).gsub(".","_")' my.properties`
eval $decl
wtedy, właściwość „my.java.prop” mogą być dostępne jako $ my_java_prop.
Można to zrobić za pomocą sed lub cokolwiek innego, ale w końcu poszedłem z rubinem na jego "irb", który był przydatny do eksperymentowania. Jest dość ograniczony (kropki powinny być zastąpione tylko przed "=", bez obsługi komentarzy), ale może być punktem wyjścia.
@Daniel, Próbowałem go pobrać, ale Bash nie lubił kropek w nazwach zmiennych.
Napisałem scenariusz, aby rozwiązać problem i umieścić go na moim githubie.
Zobacz properties-parser
Awesome! Skopiowałem skrypt do mojego projektu i ładnie odczytałem właściwości. – Will
miałem pewne sukcesy z
PROPERTIES_FILE=project.properties
function source_property {
local name=$1
eval "$name=\"$(sed -n '/^'"$name"'=/,/^[A-Z]\+_*[A-Z]*=/p' $PROPERTIES_FILE|sed -e 's/^'"$name"'=//g' -e 's/"/\\"/g'|head -n -1)\""
}
source_property 'SOME_PROPERTY'
To będzie prawdopodobnie najprostszy sposób: grep + wyciąć
# Usage: get_property FILE KEY
function get_property
{
grep "^$2=" "$1" | cut -d'=' -f2
}
To jest to, co lubię najbardziej w prostych przypadkach. Ale poprawiłbym to za pomocą 'grep"^$ PROP_KEY = "' (łącznie z ogranicznikami^i =), ponieważ klucze właściwości są często prefiksami lub przyrostkami innych kluczy. – Deleplace
To się nie powiedzie w przypadku każdej własności zawierającej znak równości. Lepszym (bardziej kompletnym, krótszym, a nawet nieco szybszym) rozwiązaniem byłoby "sed"/^ $ 2 = /!re; s /// "" $ 1 "', który ma taką samą logikę jak powyższy 'grep', ale także usuwa dopasowaną część, pozostawiając tylko wartość parametru do wydrukowania. –
Właściwości pozwalają na odstępy między nazwą właściwości a znakiem równości. Używanie wyrażenia regularnego '^ $ 2 * =' z grep lub sed pozwala na spacje – ataylor
- 1. Bash czytanie z pliku do asocjacyjnej tablicy
- 2. Równoczesne czytanie pliku (java preffered)
- 3. Czytanie pliku tekstowego z Androidem
- 4. Czytanie zmiennych z pliku w Ruby
- 5. Czytanie z pliku tekstowego w Android Studio Java
- 6. Czytanie pliku z folderu zasobów
- 7. Czytanie pliku binarnego z pythonem
- 8. Czytanie pliku .vtk z pytonem
- 9. Czytanie tekstu z pliku obrazu w Javie
- 10. Czytanie pliku Strings.xml z pliku apk
- 11. Problemy z log4.properties classpath
- 12. Jakie są konwencje nazewnictwa plików Java .properties?
- 13. Czytanie pliku wewnątrz pliku Makefile
- 14. Czytanie pliku .pdb
- 15. Zaawansowane czytanie pliku
- 16. SIGINT, aby anulować czytanie w skrypcie Bash?
- 17. Czytanie osadzonego pliku tekstowego
- 18. Czytanie pliku Windows * .dmp
- 19. Uruchomienie skryptu bash z java
- 20. Wiadomości z pliku .properties nie wyświetlają znaków UTF-8.
- 21. Jak czytać z pliku .properties przy użyciu skryptu wsadowego
- 22. Czytanie pliku tekstowego w Google GWT?
- 23. Czytanie pliku dll.config (nie app.config!) Z modułu wtyczki
- 24. Czytanie limitowanych wierszy z pliku Excela przesłanych w usługach IIS
- 25. Czytanie z pliku i przechowywanie w tablicy
- 26. C# - Czytanie rosyjskiego tekstu z pliku .txt
- 27. Czytanie nazwy pospolitej z pliku .pem
- 28. Czytanie prostego pliku Avro z HDFS
- 29. Czytanie wielu liczb z pliku tekstowego
- 30. czytanie prostego pliku INI z AS3
który jest wspaniałym pytanie :) W tym konkretnym Chciałem zobaczyć, czy istnieje prosty sposób, którego mi brakuje (nie wiem o \ zbyt głupim, aby myśleć o itp.) –
Spróbuj użyć Gradle do zbudowania i wdrożenia, a nie BASH – dart