You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jq实现文本金额右对齐?避免使用if-then-else

用jq实现金额右对齐的简洁方案

我需要用jq工具将文本中的金额进行右对齐处理,给定输入文本如下:

INPUT='
# comment
lorem ipsum

* Header
2022-01-01 Internet
    provider       30.00 EUR
    router          5.00 EUR
2022-01-01 House
    rent       321.00 EUR
    carports    20.00 EUR, 20.00 EUR
'

我已实现一个解决方案,但代码较为冗长,现寻求更简洁的实现方式,要求避免使用if-then-else语句。我的现有实现代码如下:

jq --raw-input --raw-output --argjson alignToColumn 40 '
  "\\d+\\.?\\d*\\s+EUR" as $searchPattern |
  if test($searchPattern)
  then match($searchPattern) as $match |
       sub($searchPattern;
           " " * ($alignToColumn - $match.offset - $match.length) +
           $match.string)
  else .
  end
' <<< "$INPUT"

期望输出如下:

# comment
lorem ipsum

* Header
2022-01-01 Internet
    provider                   30.00 EUR
    router                      5.00 EUR
2022-01-01 House
    rent                      321.00 EUR
    carports                   20.00 EUR, 20.00 EUR

简洁实现方案

利用jq的//空值合并运算符,可直接省去if-then-else判断:

jq --raw-input --raw-output --argjson alignColumn 40 '
  "\\d+\\.?\\d*\\s+EUR" as $amountPattern |
  match($amountPattern) |
  sub($amountPattern; " " * ($alignColumn - .offset - .length) + .string) // .
' <<< "$INPUT"

说明

  • match($amountPattern)尝试捕获行内的金额格式内容,匹配成功时返回包含偏移量(offset)、长度(length)和匹配字符串(string)的对象
  • 基于偏移量和长度计算需要填充的空格数,用空格填充后拼接匹配到的金额字符串,实现右对齐到指定列
  • 如果行内无匹配的金额格式,match返回空值,此时// .会返回原行内容,替代原有的else分支逻辑

内容的提问来源于stack exchange,提问作者jpseng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:30:16