Изменение формата `date`, чтобы иметь" 2nd "/" 3rd "/ etc. используя оператор case и / или регулярные выражения - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь написать скрипт, который будет выводить дату в следующем формате: Friday, May 2nd. Это часть присвоения, которая требует использования каждого из регулярных выражений, операторов case и sed для изменения вывода команды date в нужный формат.

Я начинаю со следующего:

#!/bin/bash
date "+%A, %B %d"

... но вывод имеет вид:

Friday, May 2

необязательная форма:

Friday, May 2nd

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Использование sed для применения серии замен (при условии соответствия регулярных выражений) может выглядеть следующим образом:

d=$(date '+%A, %B %e')

d_sed=$(sed -Ee 's/(1[0-9])$/\1th/' \
             -e 's/1$/1st/' \
             -e 's/2$/2nd/' \
             -e 's/3$/3rd/' \
             -e 's/([[:digit:]])$/\1th/' <<<"$d")

echo "Welcome $(whoami), today is $d_sed"

В этом случае каждое выражение, такое как (.*1[0-9])$, является регулярным выражением. (Использование аргумента -E включает синтаксис регулярного выражения «расширенный POSIX», с которым значительно проще работать, чем BRE, «базовый» синтаксис регулярного выражения POSIX).

Разбивка синтаксиса, используемого в этих регулярных выражениях:

  • [0-9] определяет класс символов , который соответствует одному символу в любом месте между 0 и 9. Этот конкретный также может быть записан как [[:digit:]], один из предопределенных классов.
  • $ означает «соответствовать только в том случае, если конец строки находится в этой позиции», поэтому 3$ соответствует только в том случае, если 3 является последним символом в строке.
  • (...) рассматривает содержимое скобок как группу. Это означает, что такие операторы, как * и +, рассматривают эту группу как единое целое, но также (для наших целей) действуют как оператор захвата: \1 на стороне замены ссылается на первую группу захвата , таким образом, содержание, которое было найдено в этих паренах.
0 голосов
/ 03 мая 2018

Это странное требование. Вот как бы вы использовали case для добавления порядкового суффикса

d=$(date '+%A, %B %e')
case $d in 
    *1[0-9]) d+=th ;; 
    *1) d+=st ;; 
    *2) d+=nd ;; 
    *3) d+=rd ;; 
    *)  d+=th ;; 
esac
echo "Welcome $(whoami) today is, $d"

Обратите внимание, что case не использует регулярные выражения, он использует шаблоны оболочки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...