2

Я пытаюсь написать сценарий, который удаляет все после последнего появления символа. Например, если строка DATETIME 2014.03.14 12:23:24 , я хотел бы получить только DATETIME 2014.03. , Таким образом, все после последнего появления точки должно быть удалено. Я пробовал разные варианты с sed и expr index но безуспешно. В последний раз я пытался получить индекс последней точки, а затем подстроковать его, но безрезультатно:

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

Это возвращает позицию первой точки вместо последней.

2 ответа2

5

Используйте расширение параметров. % удаляет последнюю часть строки

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

Выход:

DATETIME 2014.03.
1

Просто для полноты, я продемонстрирую способ решить это с помощью sed:

$ echo "DATETIME 2014.03.14 12:23:24" | sed 's/[^.]*$//'
DATETIME 2014.03.
  • [^.]*$ соответствует чему угодно, кроме буквальной точки, 0 или более раз, за которой следует конец строки.

Обратите внимание, что это удалит все символы из строк, которые не содержат разделитель. Если это не требуется, версия, которая "привязывает" замену к разделителю, может быть:

$ echo "DATETIME 2014.03.14 12:23:24" | sed 's/\.[^.]*$/./'
DATETIME 2014.03.
  • \. соответствует буквальной точке
  • Последний случай . повторно вставляет символ разделителя, который в противном случае был бы удален. Вариант без этого дополнительного повторения может быть:

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

    где захватывается разделитель, чтобы не вводить его явно в шаблоне подстановки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .