如何用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
相关产品推荐
相关产品推荐

