首页 > 解决方案 > 用于选择整个记录的 awk 命令在终端中有效,但在 Applescript 中无效

问题描述

我正在尝试在 AppleScript 中解析 SPARQL 查询 (CSV) 的结果。输入看起来像这样,每条记录都在一个新行上。我只想完整地挑出记录(以便用户可以从列表中选择它们)。

"work","expression","ecli","celex","alttitle"
"http://publications.europa.eu/resource/cellar/85dd7fdf-45b0-4962-8c25-f3010212b52b","http://publications.europa.eu/resource/cellar/85dd7fdf-45b0-4962-8c25-f3010212b52b.0002","ECLI:EU:C:2007:153","62006CJ0044","Gerlach"
"http://publications.europa.eu/resource/cellar/0b70a7ef-fa45-4bbe-b76e-25d1fad10d29","http://publications.europa.eu/resource/cellar/0b70a7ef-fa45-4bbe-b76e-25d1fad10d29.0002","ECLI:EU:C:1984:63","61983CJ0046","Gerlach"

以下awk命令的输出在 AppleScript 中为空(注意转义的双引号)

do shell script "awk 'BEGIN {RS = \"\"} { print $2 }'<<<" & quoted form of theInput

但是当我在终端(zsh shell)中做同样的事情时,就像这样

awk 'BEGIN {RS = ""} { print $2 }' input.txt

正如预期的那样,我确实获得了第一条记录。

标签: csvawkescapingapplescriptzsh

解决方案


awk 中的默认记录分隔符 (RS) 是\n. 将 RS 设置为空字符串有一个特殊的值,意味着记录由空行分隔。

要确定在输出的 SPARQL 查询结果中使用了哪种类型的换行符curl,请保存输出并使用vim -b output.txtand do打开它:set list。表示 CR (macOS) ,^M$ 通常表示 LF (Linux)。请注意,使用-oin 标志curl保存输出可能会导致使用不同类型的换行符,而不是简单地使用echo & theVariable & > $HOME'/Desktop/output.txt'.

另请注意, a\n通常添加在文件的最后(例如 by vim)。如果其他记录以 结尾,\r但最后一个以 结尾\n,则可以设置RS"[\r\n]",这是\ror的正则表达式模式\n。在 Applescript 中,转义特殊字符,这变成:

RS=\"[\\r\\n]\"

推荐阅读