gpt4 book ai didi

bash - jq 或 xsltproc 替代 s 表达式?

转载 作者:太空宇宙 更新时间:2023-11-03 18:48:37 25 4
gpt4 key购买 nike

我有一个项目,其中包含一堆使用 bash 脚本捆绑在一起的小程序,按照 Unix 哲学。他们的交换格式最初是这样的:

meta1a:meta1b:meta1c AST1
meta2a:meta2b:meta2c AST2

: 分隔的字段是元数据,AST 是脚本按原样传递的 s 表达式。这工作得很好,因为我可以使用 cut -d ' ' 从 AST 中分离元数据,并使用 cut -d ':' 挖掘元数据。但是,然后我需要添加一个包含空格的元数据字段,这会破坏这种格式。由于没有字段使用制表符,我切换到以下内容:

meta1a:meta1b:meta1c:meta 1 d\tAST1
meta2a:meta2b:meta2c:meta 2 d\tAST2

由于我设想将来会添加更多的元数据字段,所以我认为是时候切换到结构化程度更高的格式,而不是玩“猜标点符号”的游戏了。

我可以使用 JSON 和 jq,而不是定界符和 cut,或者我可以使用 XML 和 xsltproc,但是因为我已经对 AST 使用 s 表达式,我想知道是否有更好的方法在这里使用它们?

例如,看起来像这样的东西:

(echo '(("foo1" "bar1" "baz1" "quux 1") ast1)'
echo '(("foo2" "bar2" "baz2" "quux 2") ast2)') | sexpr 'caar'

"foo1"
"foo2"

我的要求是:

  • 以最少的样板直接使用 stdio,因为这是我的程序读取/写入数据的地方
  • 可从 shell 脚本轻松调用提供一个非常引人注目的 bash 进程调用和流水线替代方案
  • 如果可能,流式输入/输出; IE。我宁愿一次使用一个 AST 而不是消耗整个输入来寻找结束 )
  • 快速且轻量级,尤其是在被调用几次的情况下;每个 AST 只有几 KB,但它们加起来可达数百 MB
  • 至少应该在 Linux 上工作;跨平台就好了

显而易见的选择是使用 Lisp/Scheme 解释器,但我唯一使用过的是 Emacs,它太重量级了。也许另一个实现更轻量级并且适合这个?

在 Haskell 中,我玩过 shelly、turtle 和 atto-lisp,但我的大部分代码都花在了 String/Text/ByteString 之间的转换、包装/解包 Lisp、实现我自己的 car, cdr, cons

我读过一些关于 scsh 的资料,但也不知道那是否合适。

最佳答案

你可以试试 Common Lisp。

Straightforward use of stdio with minimal boilerplate, since that's where my programs read/write their data

(loop for (attributes ast) = (safe-read) do (print ...)
  • 从标准输入和输出读取/写入。
  • safe-read 应该在读取时禁止执行代码。至少有 one implementation .除非您完全了解其中的内容,否则不要直接评估您的 AST。

Easily callable from shell scripts or provide a very compelling alternative to bash's process invocation and pipelining

本着与 java -jar ... 相同的精神,您可以启动您的 Common Lisp 可执行文件,例如sbcl,参数中有一个脚本:sbcl --load file.lisp。您甚至可以转储应用程序的核心或可执行核心,并预加载所有内容(save-lisp-and-die)。或者,使用cl-launch它自动且可移植地执行上述操作,并生成 shell 脚本和/或从您的代码生成可执行程序。

Streaming I/O if possible; ie. I'd rather work with one AST at a time rather than consuming the whole input looking for a closing )

如果整个输入流以 ( 开始,那么 read 将读取到结束的 ) 字符,但实际上这很少这样做:Common Lisp 中的源代码不是包含在每个文件的一对括号中,而是作为一系列形式。如果您的流产生的不是一个而是多个 s-exp,读者将一次阅读一个。

Fast and lightweight, especially if it's being invoked a few times; each AST is only a few KB, but they can add up to hundreds of MB

它会很快,特别是如果你保存了一个核心。轻量级,众所周知,lisp 图像会占用一些磁盘空间(例如 46MB),但这很少成为问题。为什么重要?也许您对轻量级的含义有另一种定义,因为这与您将要解析的 AST 的大小无关。不过,阅读这些 AST 应该没有问题。

Should work on Linux at least; cross-platform would be nice

参见 Wikipedia .例如,Clozure CL (CCL) 在 Mac OS X、FreeBSD、Linux、Solaris 和 Windows 上运行,32/64 位。

关于bash - jq 或 xsltproc 替代 s 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31232843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com