zmienna bash LATLNG zawiera wartość szerokości i długości geograficznej w podobnych nawiasach
(53.3096,-6.28396)
Chcę parsować je do zmiennej o nazwie LAT i LON, którą próbuję wykonać za pomocą sed tak
LAT=$(sed "s/(\(.*\),\(.*\))/\1/g" "$LATLNG")
LON=$(sed "s/(\(.*\),\(.*\))/\2/g" "$LATLNG")
Jednak pojawia się następujący błąd:
sed: can't read (53.3096,-6.28396): No such file or directory
bash
zmiennej.Odpowiedzi:
Można to rozwiązać za pomocą czystej składni powłoki. Wymaga jednak zmiennej temp z powodu nawiasów (nawiasów):
Alternatywnie możesz to zrobić za jednym razem, grając
IFS
i używającread
wbudowanego:źródło
#!/bin/bash
Odpowiedź SiegeX jest lepsza w tym konkretnym przypadku, ale powinieneś także wiedzieć, jak przekazać dowolny tekst
sed
.sed
oczekuje nazw plików jako drugiego, trzeciego itd. parametru, a jeśli nie znajdzie żadnych nazw plików, odczyta ze swojego standardowego wejścia. Więc jeśli masz tekst, który chcesz przetworzyć, którego nie ma w pliku, musisz go potokowaćsed
. Najprostszym sposobem jest to:Zatem twój przykład wyglądałby następująco:
Alternatywne (lepsze, ale bardziej niejasne) metody
Jeśli uważasz, że jest jakaś szansa
$LATLNG
zacząć od kreski lub jeśli chcesz być pedantyczny, powinieneś użyćprintf
zamiastecho
:Lub „tutaj dokument”, ale może to być trochę niezręczne w przypadku używanej konstrukcji:
Lub jeśli używasz
bash
i nie martwisz się o przenośność, możesz użyć ciągu „tutaj”:źródło
Oto rozwiązanie, które będzie działać w dowolnej powłoce POSIX:
Oto inne równie przenośne rozwiązanie, które analizuje zastosowaną składnię.
źródło
źródło
set -- ...
Jest bardzo duża szansa, że pierwsza postać jest-
.