- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个项目,其中包含一堆使用 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"
我的要求是:
)
显而易见的选择是使用 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/
我用 IntelliJ IDEA 2021.1 CE 在 流行!_OS 20.04 与 bash 5.0.17 . 问题造句:我将IntelliJ终端设置为/bin/bash通过 IntelliJ 设
给定如下命令: bash --shortcuts 我想显示一个快捷方式列表,就像在这个页面上一样: http://www.skorks.com/2009/09/bash-shortcuts-for-m
我有一个脚本可以操作数据、创建参数并将它们发送到第二个脚本。其中一个参数包含一个空格。 脚本1.sh: args=() args+=("A") args+=("1 2") args+=("B") .
我的脚本的“只运行一次”版本的一个非常简单的示例: ./myscript.sh var1 "var2 with spaces" var3 #!/bin/bash echo $1 #output: va
我想了解数字( double )在 bash 中是如何表示的,以及当我在 bash 中以十六进制格式打印数字时会发生什么。 根据 IEEE 754 标准,double 应由 64 位表示:52 位(1
我试图在 bash -c "..." 命令中获取 bash 脚本,但它不起作用。 如果我在 bash -c "..." 之外运行命令,它会起作用。 我需要使用 bash -c "..." 因为我想确保
如何检测我的 bash shell 中是否加载了 bash 补全包?从 bash-completion 的 2.1 版(包含在 Debian 8 中)开始,除了 BASH_COMPLETION_COM
我的 bash_profile 中有一个投影函数。现在我试图从 bash 脚本中调用这个函数,但是我得到了一个未找到的错误。如何使投影函数对 bash 脚本可见? 最佳答案 必须导出函数 export
我正在编写一个 bash 脚本,它接受许多命令行参数(可能包括空格)并通过登录 shell 将它们全部传递给程序 (/bin/some_program)。从 bash 脚本调用的登录 shell 将取
当我创建一个新的 bash 进程时,提示符默认为一个非常简单的提示符。我知道我可以编辑 .bashrc 等来更改它,但是有没有办法使用 bash 命令传递提示? 谢谢! 最佳答案 提示由 PS1、PS
好的,我希望这个问题有一定道理,但是 bash shell 和 bash 终端之间有什么区别?例子。当我第一次打开终端时,会提示我当前的目录和用户名。在终端窗口标题中显示 -bash- ,当我键入 e
我是 SBCL 的新手,我正在尝试从 bash 终端运行存储在文本文件中的 Lisp 脚本。 这是我在文件开头写的内容 http://www.sbcl.org/manual/#Running-from
我知道我们可以在 bash 中使用将十六进制转换为十进制 #!/bin/bash echo "Type a hex number" read hexNum echo $(( 16#$hexNum ))
我正在尝试在 bash 脚本中自动完成文件夹名称。如果我输入完整的文件夹名称,一切正常,但我不知道如何自动完成名称。有什么想法吗? repo() { cd ~/Desktop/_REPOS/$1 }
我想检查远程网站上的一些文件。 这里是bash命令生成计算文件md5的命令 [root]# head -n 3 zrcpathAll | awk '{print $3}' | xargs -I {}
是否有任何内置函数可以使用 bash shell 脚本从给定日期获取下周日(下周一、下周二等)?例如,2014 年 9 月 1 日之后的第一个星期日是什么时候?我预计 2014 年 9 月 7 日。
我一直在尝试根据表格重命名一些特定文件,但没有成功。它要么重命名所有文件,要么给出错误。 该目录包含数百个以长条形码命名的文件,我只想重命名包含模式 _1_ 的文件。 例子 barcode_1_bar
bash 中有没有办法用变量的内容替换文本文件中的占位符? 例如,我想发送一封电子邮件通知,如下所示: Dear Foo, Alert: blah blah blah blah blah blah
我有一个 bash 脚本,它在某些字符串上附加了一个重音字符,导致它失败,我找不到这些字符在哪里或如何进入那里。 这是一些示例输出: mv: cannot move â/tmp/myapp.zipâ
这个问题在这里已经有了答案: How do I place stdout on edit line? (1 个回答) Can a bash script prepopulate the prompt
我是一名优秀的程序员,十分优秀!