使用sed将罗马数字转换为阿拉伯数字

时间:2011-08-15 22:15:03

标签: regex sed roman-numerals

我有像这样的文本文件格式

SKI
SKII
SKIII
SKIV
SKV
SKVI
SKVII

我想用sed命令将其转换为数字。你能救我一下吗?

SK1
SK2
SK3
SK4
SK5
SK6
SK7

非常感谢!

1 个答案:

答案 0 :(得分:2)

没有简单的方法可以做到这一点。需要蛮力加上一些小心:

sed -e 's/SKIII/SK3/'  \
    -e 's/SKII/SK2/'   \
    -e 's/SKIV/SK4/'   \
    -e 's/SKVIII/SK8/' \
    -e 's/SKVII/SK7/'  \
    -e 's/SKVI/SK6/'   \
    -e 's/SKV/SK5/'    \
    -e 's/SKI/SK1/' "$@"

通常,较长的序列必须位于较短的序列之前。这仅涉及1-8;概括它是非常困难的。


  

实际上需要从1到29的数字。我该如何处理?同样的方法?

如果您放弃了SK前缀,那么稍加注意,您不需要29个单独的-e表达式(当然这会起作用)。此脚本将带您到39(测试到31,一个月内的最大天数);我相信,达到99所需的扩展是相当明显的(我认为还有13个-e表达式)。请注意包含零的数字的特殊情况处理。

sed \
    -e 's/IX/9/'   \
    -e 's/XXX$/30/' \
    -e 's/XXX/3/'   \
    -e 's/XX$/20/' \
    -e 's/XX/2/'   \
    -e 's/X$/10/'  \
    -e 's/X/1/'    \
    -e 's/VIII/8/' \
    -e 's/VII/7/'  \
    -e 's/III/3/'  \
    -e 's/II/2/'   \
    -e 's/IV/4/'   \
    -e 's/VI/6/'   \
    -e 's/V/5/'    \
    -e 's/I/1/' "$@"