需要一个简单的预处理器来操作文本fi

2024-05-03 12:01:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要转换一个文本文件,其中包含嵌入到新文件中的适度表达式,而不需要它们。任何表达语言都可以。示例:

输入文件:

days = 12
times_per_day = 10
extra = 2
The quick brown fox jumped $days * ($times_per_day + $extra) times over the lazy dog

输出文件:

^{pr2}$

这需要在Windows上运行。我的想法是:使用C预处理器(但我不认为它会静态地计算所有表达式?),或者用perl/python/awk/etc编写我的输入文件(不过,它不太可读)。在

我需要在3-4个小时内解决这个问题,所以我不想编写完整的解析器。在


Tags: 文件the语言示例表达式quickdaysextra
3条回答

如果您打算使用AWK,为什么gnubash不适合?像这样:

#!/bin/bash
days=12
times_per_day=10
extra=2
cat << EOF
The quick brown fox jumped $((days * (times_per_day + extra))) times over the lazy dog
EOF

希望可读性很强。在

如果出于某种原因您想删除cat(它是一个外部实用程序),那么这不是问题:

^{pr2}$

在Python中,我将使用模板引擎。比如金贾2号。代码:

from jinja2 import Environment, FileSystemLoader, Template


def main():
    environment = Environment(loader=FileSystemLoader('.'), trim_blocks=True)
    template = environment.get_template('test.tpl')
    print template.render()


if __name__ == '__main__':
    main()

模板文件test.tpl

^{pr2}$

输出:

The quick brown fox jumped 144 times over the lazy dog.

任何时候使用^{},从定义上讲,它几乎就是一个黑客作业。在

但是,下面的perl“one liner”确实可以在这个特定实例中完成任务:

perl -ne '!eof() ? eval "\$$_" : s/(?<!\S)(?=[[:punct:]\d]*\$)((?:\$\w+|[[:punct:]\d]+|\s+)+)(?!\S)/\@{[$1]}/g && print eval qq{"$_"};' fox.txt

输出:

^{pr2}$

说明:

开关

  • -n:为输入文件中的每一行创建一个while(<>){...}循环。在
  • -e:告诉{}在命令行上执行代码。在

代码

  • !eof():基于文件末尾的选择性处理。在
  • eval "\$$_":将foo = 3这样的行计算成$foo = 3
  • s/(?<!\S)(?=[[:punct:]\d]*\$)((?:\$\w+|[[:punct:]\d]+|\s+)+)(?!\S)/\@{[$1]}/g

    string $foo * $bar end等文本翻译成string @{[$foo * $bar]} end

  • print eval qq{"$_"};:打印最后一行的计算结果。

相关问题 更多 >