Используйте sed для преобразования римских цифр в арабские цифры - PullRequest
2 голосов
/ 16 августа 2011

У меня есть текстовый формат файла, подобный этому

SKI
SKII
SKIII
SKIV
SKV
SKVI
SKVII

Я хочу преобразовать его с помощью команды sed в числовое значение. Вы можете мне помочь?

SK1
SK2
SK3
SK4
SK5
SK6
SK7

Большое спасибо!

1 Ответ

2 голосов
/ 16 августа 2011

Нет тривиального способа сделать это.Требуется грубая сила плюс некоторая осторожность:

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/' "$@"
...