如何将‘YYYY-YYYY’格式的学年两个年份分别减1?
解决学年年份分别减1的问题
你的问题在于直接对带连字符的字符串做减法操作,shell没法识别这种格式的数字运算——它只会把整个字符串当成一个整体,没法拆分出两个年份分别计算。得先拆分年份、分别运算,再重新拼接,下面给几种实用的实现方式:
方法1:用awk(适合管道批量处理)
awk可以直接按连字符拆分字符串,对两个年份分别做减法后拼接:
echo "2020-2021" | awk -F'-' '{print $1-1 "-" $2-1}'
-F'-'指定用连字符作为分隔符,把输入字符串拆成两部分$1是第一个年份,$1-1完成减1运算;$2是第二个年份,同理处理- 最后用
"-"把两个运算结果拼接输出
方法2:Bash原生处理(适合脚本内变量操作)
如果是在bash脚本里处理变量,不用外部工具也能实现:
# 定义原始学年字符串 school_year="2020-2021" # 拆分出第一个年份(去掉最后一个-及后面的内容) first_year=${school_year%-*} # 拆分出第二个年份(去掉第一个-及前面的内容) second_year=${school_year#*-} # 分别减1后拼接成新字符串 new_school_year=$((first_year-1))-$((second_year-1)) # 输出结果 echo $new_school_year
${var%-*}和${var#*-}是bash的字符串截取语法,专门用来拆分带分隔符的字符串$((...))是bash的算术运算语法,直接对数字做减法
方法3:用sed结合bash运算(一行式处理)
sed的e选项可以把替换后的内容当作命令执行,实现一行式处理:
echo "2020-2021" | sed -E 's/([0-9]+)-([0-9]+)/echo $((\1-1))-$((\2-1))/e'
-E启用扩展正则表达式,([0-9]+)捕获两个年份数字\1和\2对应捕获到的两个年份,分别做减1运算后拼接e选项让sed执行拼接后的echo命令,输出最终结果
内容的提问来源于stack exchange,提问作者jovlog
相关产品推荐
相关产品推荐

