W skrypcie bash
Mam ciąg znaków, który zawiera kilka słów oddzielonych jednym lub więcej spacjami. to znaczy:
Name Age Sex ID Address
Jeśli chcę znaleźć dowolne słowo, na przykład chcę znaleźć indeks słowa „Wiek”, jak mogę to zrobić?
Czy jest jakieś polecenie, które zwróci bezpośrednio numer indeksu słowa, którego chcę?
Dzięki.
Odpowiedzi:
Bash samodzielnie wykonuje dzielenie wyrazów na ciągi - w rzeczywistości częściej, niż to, unikając tego, jest to problem, a powód cytowania jest tak ważny. W twoim przypadku łatwo to wykorzystać: po prostu umieść łańcuch w tablicy bez cytowania go - bash użyje podziału słów, aby oddzielić poszczególne elementy. Zakładając, że Twój ciąg jest przechowywany w zmiennej
$str
,zwróci tablicę 5 elementów. Indeks tablicy jest indeksem słów (licząc od 0, jak w większości języków skryptowych i programistycznych), tzn. Dostęp do „wieku” można uzyskać za pomocą
lub, jeśli chcesz znaleźć indeks elementu według zawartości, zapętl się nad tablicą, tj
źródło
Zamień * Age na Age - spowoduje to usunięcie czegokolwiek przed „Age”:
Zdobądź wszystko przed „Wiekiem”
Uzyskaj długość tego ciągu (który jest indeksem „Wiek”):
źródło
export L='debug info warn error'; export GTE='warn'; echo ${L/*${GTE}/${GTE}}
drukuje „warn error”Jeśli nie musisz ściśle używać bash, ale możesz korzystać z innych programów często spotykanych w systemach z bash, możesz użyć czegoś takiego:
Python rozpoczyna indeksowanie ciągów od zera, dlatego dodałem +1 na końcu polecenia.
źródło
Możesz użyć natywnego wyrażenia regularnego bash
Wynik
źródło
Uwaga : Zakładając, że przez indeks rozumiesz, że chcesz wiedzieć, które to słowo (od 0), a nie jaki znak w ciągu zaczyna się od tego słowa. Inne odpowiedzi dotyczą tego drugiego.
Nie jestem tego świadomy, ale możesz to zrobić. Dwie sztuczki:
Kod:
źródło
Wypróbuj następujący oneliner javascript w powłoce (użyj powłoki javascript):
Lub z dokumentem tutaj:
źródło
Znalazłem rozwiązanie, które działa dobrze.
Działa podobnie jak funkcja indexOf () w Javie, która zwraca pierwsze wystąpienie ciągu wejściowego.
Znaleźć to rozwiązanie tutaj http://www.linuxquestions.org/questions/linux-newbie-8/bash-string-manipulation-help-670627/ (ostatni post). Ten facet uratował mi dzień. Podziękowania dla niego.
Szybszy sposób, jeśli chcesz wykonać podciąg z pierwszego indeksu.
/programming/10349102/shell-script-substring-from-first-indexof-substring
źródło
Jeśli dostępne są coreutils, możesz to zrobić w następujący sposób:
Na żądanie MariusMatutiae dodaję wyjaśnienie, jak działa ta 3-etapowa operacja:
W celu uzyskania referencji sprawdź:
http://www.tldp.org/LDP/abs/html/parameter-substitution.html (przejdź do: „Zmienna rozbudowa / zamiana podciągów”)
http://www.gnu.org/software/coreutils/manual/coreutils .html (przejdź do: „Polecenie cięcia” i „Wywołanie wc”
źródło
Połączenie dwóch wcześniej podanych odpowiedzi, przy użyciu czystych tablic bash i zamiany podciągów.
Chodzi o to, aby uzyskać ciąg wszystkich słów przed tym, którego chcesz, a następnie policzyć liczbę słów w tym podciągu, przekształcając je w tablicę.
Oczywiście Wiek można zapisać w innej zmiennej
needle
, a następnie użyć${haystack%$needle*}
. Spodziewaj się problemów, jeśli szukane słowo jest podzbiorem innego słowa, w którym to przypadku odpowiedź kopischke nadal działa.źródło
To 7-letnie pytanie, ale niektórzy mogą potrzebować odpowiedzi w czystym stylu.
źródło