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 關注
- 277 瀏覽
添加回答
舉報