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它不使用正则表达式,而是使用外壳模式
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中找到的内容。
- 2 回答
- 0 关注
- 246 浏览
添加回答
举报