【问题标题】:How to you replace tags in file?如何替换文件中的标签?
【发布时间】:2014-02-05 13:44:02
【问题描述】:

鉴于标签已排序,我需要替换模板文件中的一些标签。 例如:

\beqin{document}
text $1
test 3 Dolèren  ipsum $2
$6

假设文件被命名为 template.tex 并且替代脚本被称为:

script /path/template.tex a b c<br/>

它应该给我:

\begin{document}
text a
test 3 Dolèren  ipsum b

(看到 $6 被省略是因为没有第六个输入,而 c 也是因为没有 $3)
简而言之,我需要一个类型为 myfunc :: FilePath -> [String] -> IO ()
的函数 输出可能在标准输出中。

至于语言,它可能是 python 或 haskell。
是否有任何现有的库可以做到这一点? 我注定要使用秒差吗?或者有什么众所周知的方法可以简单地做到这一点?

请不要告诉我使用 bash,因为我不受平台限制。
标签 $1 $2 也可能是其他东西,例如

【问题讨论】:

  • 如果您想要任意标签,您很可能需要编写自己的解析器。 Parsec 不是唯一的选择,因为正则表达式替换在这里可能更有意义。
  • 注定要使用 Parsec 并不是一件坏事,但是,是的,正如@bheklilr 所说,正则表达式在两种语言中都很好地存在。
  • Please do not tell me to use bash as I am not platform bound. -- 你能详细说明一下吗?
  • 对于如此琐碎和正则表达式的事情,使用 parsec 似乎有点矫枉过正,而我理解的语法带有不可预见的错误......只是有些人觉得没什么技术性。我也希望有人已经做到了:)
  • 几天前我在 Haskell 中创建了 inserts 库。这足以完成您的任务,但它使用不同的语法。 hackage.haskell.org/package/inserts

标签: python templates haskell tags


【解决方案1】:

你可以使用我的inserts 包。它提供了一种非常简单的模板语法,尽管它与您的 $ 样式语法不同。

import           Text.Template.Inserts
import qualified Data.ByteString.Char8 as S

doc :: S.ByteString
doc = "\beqin{document}\ntext {{1}}\ntest 3 Dolèren  ipsum {{2}}\n{{6}}\n"

replace :: [S.ByteString] -> S.ByteString -> Maybe S.ByteString
replace vals name = case lookup name dict of
    Nothing          -> Just S.empty
    Just replacement -> Just replacement
  where dict :: [(S.ByteString, S.ByteString)] 
        dict = zip (map (S.pack . show) [1..]) vals

main = case parseTemplate doc of
  Left err -> print err
  Right t  -> case runTemplate replace t of
    Right output -> print output
    Left e       -> error "Impossible!"

【讨论】:

    【解决方案2】:

    我想 format 包中的 renderFormatString 函数正是你要找的。​​p>

    【讨论】:

      猜你喜欢
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2017-11-27
      相关资源
      最近更新 更多