为了账号安全,请及时绑定邮箱和手机立即绑定

修改“日期”格式为“第二” /“第三” /等。使用案例陈述和/或正则表达式

修改“日期”格式为“第二” /“第三” /等。使用案例陈述和/或正则表达式

HUWWW 2021-04-04 16:13:13
我正在尝试编写一个脚本,该脚本将以以下格式输出日期:Friday, May 2nd。这是分配的一部分,它要求使用每一个正则表达式,一条case语句,并将命令sed的输出修改date为所需的格式。我从以下内容开始:#!/bin/bash date "+%A, %B %d"...但是输出的形式为:Friday, May 2不是以下形式的必需形式:Friday, May 2nd
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

这是一个奇怪的要求。这是您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它不使用正则表达式,而是使用外壳模式


查看完整回答
反对 回复 2021-04-16
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

使用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])$都是regex。(使用该-E参数将启用“ POSIX扩展”正则表达式语法,该语法比“基本” POSIX regex语法BRE更加容易使用)。

分解那些正则表达式中使用的语法:

  • [0-9]定义一个字符类,该字符类0和之间的任意位置匹配单个字符9。这个特定的类也可以写成[[:digit:]]预定义类之一。

  • $表示“仅当行尾位于此位置3$时才匹配”,因此仅当a3是行中的最后一个字符时才匹配。

  • (...)将括号的内容视为一个组。这意味着操作员喜欢*并将+该组当作一个单元对待,而且(出于我们的目的)还充当捕获操作员:\1在替换方面,它指的是第一个捕获组,因此,是在那些parens中找到的内容。


查看完整回答
反对 回复 2021-04-16
  • 2 回答
  • 0 关注
  • 246 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信