Использование 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
на стороне замены ссылается на первую группу захвата , таким образом, содержание, которое было найдено в этих паренах.