Временное изменение режимов округления не такое уж необычное, и это возможно с помощью bin / printf
, хотя не как такового , вам нужно изменить источники.
Вам нужны исходные коды coreutils, я использовал последнюю доступную сегодня версию, которая была http://ftp.gnu.org/gnu/coreutils/coreutils-8.24.tar.xz .
Распакуйте в каталог по вашему выбору с помощью
tar xJfv coreutils-8.24.tar.xz
Перейдите в исходный каталог
cd coreutils-8.24
Загрузите файл src / printf.c
в выбранный вами редактор и замените всю функцию main
следующей функцией, включая обе директивы препроцессора, чтобы включить файлы заголовков math.h
и fenv.h
. Основная функция находится в конце и начинается с int main ...
и заканчивается в самом конце файла закрывающей скобкой }
#include
#include
int
main (int argc, char **argv)
{
char *format;
char *rounding_env;
int args_used;
int rounding_mode;
initialize_main (&argc, &argv);
set_program_name (argv[0]);
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
atexit (close_stdout);
exit_status = EXIT_SUCCESS;
posixly_correct = (getenv ("POSIXLY_CORRECT") != NULL);
// accept rounding modes from an environment variable
if ((rounding_env = getenv ("BIN_PRINTF_ROUNDING_MODE")) != NULL)
{
rounding_mode = atoi(rounding_env);
switch (rounding_mode)
{
case 0:
if (fesetround(FE_TOWARDZERO) != 0)
{
error (0, 0, _("setting rounding mode to roundTowardZero failed"));
return EXIT_FAILURE;
}
break;
case 1:
if (fesetround(FE_TONEAREST) != 0)
{
error (0, 0, _("setting rounding mode to roundTiesToEven failed"));
return EXIT_FAILURE;
}
break;
case 2:
if (fesetround(FE_UPWARD) != 0)
{
error (0, 0, _("setting rounding mode to roundTowardPositive failed"));
return EXIT_FAILURE;
}
break;
case 3:
if (fesetround(FE_DOWNWARD) != 0)
{
error (0, 0, _("setting rounding mode to roundTowardNegative failed"));
return EXIT_FAILURE;
}
break;
default:
error (0, 0, _("setting rounding mode failed for unknown reason"));
return EXIT_FAILURE;
}
}
/* We directly parse options, rather than use parse_long_options, in
order to avoid accepting abbreviations. */
if (argc == 2)
{
if (STREQ (argv[1], "--help"))
usage (EXIT_SUCCESS);
if (STREQ (argv[1], "--version"))
{
version_etc (stdout, PROGRAM_NAME, PACKAGE_NAME, Version, AUTHORS,
(char *) NULL);
return EXIT_SUCCESS;
}
}
/* The above handles --help and --version.
Since there is no other invocation of getopt, handle '--' here. */
if (1 < argc && STREQ (argv[1], "--"))
{
--argc;
++argv;
}
if (argc <= 1)
{
error (0, 0, _("missing operand"));
usage (EXIT_FAILURE);
}
format = argv[1];
argc -= 2;
argv += 2;
do
{
args_used = print_formatted (format, argc, argv);
argc -= args_used;
argv += args_used;
}
while (args_used > 0 && argc > 0);
if (argc > 0)
error (0, 0,
_("warning: ignoring excess arguments, starting with %s"),
quote (argv[0]));
return exit_status;
}
Run ./ configure
следующим образом
LIBS = -lm ./configure --program-suffix = -own
Он помещает суффикс -own
в каждую подпрограмму (их много) на всякий случай, если вы хотите установить их все и не уверены, подходят ли они к остальной системе. Coreutils не названы core utils без причины!
Но наиболее важным является LIBS = -lm
перед строкой. Нам нужна математическая библиотека, и эта команда сообщает ./ configure
, чтобы добавить ее в список необходимых библиотек.
Запустите make
make
Если у вас многоядерная / многопроцессорная система, попробуйте
make -j4
, где число (здесь «4») должно представлять количество ядер, которое вы хотите сэкономить. для этой работы.
Если все прошло хорошо, у вас есть новый printf
int src / printf
. Попробуйте:
BIN_PRINTF_ROUNDING_MODE = 1 ./src/printf '% .0f \ n' 196.5
BIN_PRINTF_ROUNDING_MODE = 2 ./src/printf '% .0f \ n' 196.5
Обе команды должны отличаться выход. Числа после IN_PRINTF_ROUNDING_MODE
означают:
Вы можете установить весь файл (не рекомендуется) или просто скопировать файл (настоятельно рекомендуется переименовать его!) src / printf
в каталог на вашем ] PATH
и используйте, как описано выше.
Descargué y descomprimí el archivo, y los finales de línea son CRLF, por lo que debe tener en cuenta eso, ya sea utilizando una herramienta como fromdos
, o si no desea modificar el archivo, puede hacerlo dígale a Perl que quiere que haga la traducción con su capa:crlf
PerlIO , que es lo que estoy haciendo a continuación con la variable de entorno PERLIO
. (Hay otras formas de cambiar las capas, pero esta fue la más fácil para una sola línea -.)
Estoy usando el operador flip -flop...
para extraer solo el párrafo que coincide con la expresión regular más el siguiente que coincide con/^1\./
(ya que todos los párrafos en el archivo comienzan con [
o1.
).
wget http://kingbase-chess.net/download/650 -O KingBaseLite2018-03.zip
unzip KingBaseLite2018-03.zip
PERLIO=:crlf perl -00ne 'print if /"FIDE Candidates 2018"/.../^1\./' KingBaseLite2018-03.pgn