Bash podciąg ostatniego wystąpienia znaku

2

Próbuję napisać skrypt, który usuwa wszystko po ostatnim wystąpieniu znaku. Na przykład jeśli łańcuch jest DATETIME 2014.03.14 12:23:24, Chciałbym dostać sprawiedliwość DATETIME 2014.03.. Więc wszystko po ostatnim wystąpieniu kropki powinno zostać usunięte. Próbowałem różnych wariantów sed i expr index ale bez powodzenia. Ostatnim razem, gdy próbowałem uzyskać indeks ostatniej kropki, a następnie podciąłem go, ale bez żadnego wyniku:

expr index "DATETIME 2014.03.14 12:23:24" '.[0-9][/&][0-9]'

Zwraca pozycję pierwszej kropki zamiast ostatniej.

RegedUser00x
źródło

Odpowiedzi:

5

Użyj rozszerzenia parametrów. % usuwa ostatnią część ciągu

 d='DATETIME 2014.03.14 12:23:24'
 echo ${d%.*}.

Wydajność:

DATETIME 2014.03.
choroba
źródło
1

Dla kompletności przedstawiam sposób rozwiązania tego problemu sed:

$ echo "DATETIME 2014.03.14 12:23:24" | sed 's/[^.]*$//'
DATETIME 2014.03.
  • [^.]*$ pasuje do wszystkiego ale literalna kropka, 0 lub więcej razy, a następnie koniec linii.

Zauważ, że spowoduje to usunięcie wszystkich znaków z łańcuchów, które nie zawierają separatora. Jeśli nie jest to pożądane, wersją, która „zakotwicza” substytucję separatora, może być:

$ echo "DATETIME 2014.03.14 12:23:24" | sed 's/\.[^.]*$/./'
DATETIME 2014.03.
  • \. pasuje do literalnej kropki.
  • Ostatnie wystąpienie . ponownie wstawia znak ogranicznika, który w przeciwnym razie zostałby usunięty. Wariantem bez tego dodatkowego powtórzenia może być:

    $ echo "DATETIME 2014.03.14 12:23:24" | sed 's/\(\.\)[^.]*$/\1/'
    DATETIME 2014.03.
    

    gdzie separator jest przechwytywany, aby nie musiał ponownie wprowadzać go ponownie we wzorze podstawiania.

Daniel Andersson
źródło