Вопрос: Подстрока Bash - последнее появление символа


Я пытаюсь написать скрипт, который удаляет все после последнего появления символа. Например, если строка 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
2018-03-14 12:26


Источник




Ответы:


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

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

Вывод:

DATETIME 2014.03.

5
2018-03-14 12:31





Просто для полноты я продемонстрирую способ ее решения 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.
    

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


1
2018-03-14 12:49