如何通过 jq 的“join”函数使用换行符 (\n) 和制表符 (\t) 等非显示字符

2024-03-13

我在互联网上找不到这个,所以我想将其添加为文档。

我想在非显示字符周围加入一个 json 数组\30(“RecordSeparator”),这样我就可以在 bash 中安全地迭代它,但我不太清楚该怎么做。我试过echo '["one","two","three"]' | jq 'join("\30")'以及一些排列,但它不起作用。

事实证明解决方案非常简单......(参见答案)


Use jq -j消除记录之间的文字换行符并仅使用您自己的分隔符。这适用于您的简单情况:

#!/usr/bin/env bash
data='["one","two","three"]'
sep=$'\x1e' # works only for non-NUL characters, see NUL version below
while IFS= read -r -d "$sep" rec || [[ $rec ]]; do
  printf 'Record: %q\n' "$rec"
done < <(jq -j --arg sep "$sep" 'join($sep)' <<<"$data")

...但它也适用于一个更有趣的场景,即幼稚的答案失败了:

#!/usr/bin/env bash
data='["two\nlines","*"]'
while IFS= read -r -d $'\x1e' rec || [[ $rec ]]; do
  printf 'Record: %q\n' "$rec"
done < <(jq -j 'join("\u001e")' <<<"$data")

返回(当在 Cygwin 上运行时,因此是 CRLF):

Record: $'two\r\nlines'
Record: \*

也就是说,如果愤怒地使用它,我建议使用 NUL 分隔符,并从输入值中过滤掉它们:

#!/usr/bin/env bash
data='["two\nlines","three\ttab-separated\twords","*","nul\u0000here"]'
while IFS= read -r -d '' rec || [[ $rec ]]; do
  printf 'Record: %q\n' "$rec"
done < <(jq -j '[.[] | gsub("\u0000"; "@NUL@")] | join("\u0000")' <<<"$data")

NUL 是一个不错的选择,因为它是一个比不能存储在 C 字符串中(就像 bash 使用的那样),所以当它们被删除时,可以忠实地传达的数据范围不会丢失——如果它们did如果它到达 shell,它会(取决于版本)丢弃它们,或者在第一次出现时截断字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 jq 的“join”函数使用换行符 (\n) 和制表符 (\t) 等非显示字符 的相关文章

随机推荐

  • 从 Wikipedia API 中提取数据

    我希望能够使用 json 从维基百科中提取标题和描述 所以 维基百科不是我的问题 我是 json 的新手 想知道如何使用它 现在我知道有数百个教程 但我已经工作了几个小时 它只是不显示任何内容 这是我的代码
  • 如何通过peerJS 点对点连接接收数据?

    我正在尝试使用peerJS 连接两个对等点 我几乎只是在遵循他们的 入门 但我仍然在挣扎 下面是我到目前为止得到的代码
  • Java:从文件加载图像,编辑并添加到 JPanel

    我想将计算机中的图像加载到 2D Graphics 中 以便之后可以对其进行编辑 然后我想将其添加到JPanel 如果您需要查看我的项目 我可以将其发送给您 void loadImage FileDialog fd new FileDial
  • OSX 10.8 xcrun(没有这样的文件或目录)

    执行时gem install jekyll在 OSX 10 8 上安装了来自 Apple 开发人员站点的独立命令行工具包 无 Xcode 时 我遇到以下错误 构建本机扩展 这可能需要一段时间 错误 安装 jekyll 时出错 错误 无法构建
  • SQL 查询限制来自一个表的行,而不是结果集

    我正在运行一个带有连接的简单查询 类似于 SELECT t1 a t2 b FROM t1 LEFT JOIN t2 ON LIMIT 5 As t1有很多行t2 任何大于 2 的数字 LIMIT 语句不会返回前 5 行t1以及来自的相应条
  • const 有什么问题吗?

    已知的不足有哪些const在 C 和 C 0x 中 唯一的问题是const就是这样被严重低估许多开发商 它是 C 工具箱中最好的工具之一 非常锋利 但割伤自己并不危险
  • 禁用的 uibarbuttonitem 的文本颜色始终是正常状态的颜色

    我在我的代码中写道 UIBarButtonItem appearanceWhenContainedIn UINavigationBar class nil setTitleTextAttributes NSForegroundColorAt
  • 限制 Jenkins 仅针对特定分支进行并发构建

    我一直在寻找如何做到这一点一段时间 但我开始认为这是不可能的 与此类似的每个问题似乎都与限制某些节点或整个管道的运行更相关 我们在 Jenkins 中有一个多分支管道 用于处理 PR 构建 分阶段测试和生产发布 三者中的每一个都通过when
  • VC++ 缺少类型说明符 - 假定为 int。注意:C++ 不支持default-int [重复]

    这个问题在这里已经有答案了 以下代码在 VC 6 0 中编译得很好 但是当我在 VS2005 中打开该项目时 出现此错误 BCGPopupMenu h 100 错误 C4430 缺少类型说明符 int 假定 注意 C 不支持default
  • 为可移植类库创建 NuGet 包时出错

    我是 Nuget 新手 我正在尝试为可移植类库项目创建一个 NuGet 包 该项目对我创建的另一个可移植类库具有包依赖性 我遇到了一个问题 在调用时收到错误块包对于项目文件测试组件2 csproj 我从 VS 2013 中的 Portabl
  • &(单个与符号)和 | 是什么意思(单管)运算符进行比较运算?

    在这样的声明中 if valueA valueB 99 print they don t equal 99 什么是 运营商做什么 我认为这意味着如果 valueS 和 value 都不等于 99 则执行该块 然后什么是 在此声明中执行以下操
  • 在zf2中配置多个数据库

    如何在 Zend Framework 2 中配置 和使用 多个数据库 目前我的 global php 中有这个 return array db gt array driver gt Pdo dsn gt mysql dbname my db
  • Pythoncoverage.py 排除行

    背景 我有几个使用coverage py 的Django 项目 并且一直在尝试向我的 coveragerc 配置文件的exclude lines 部分添加一些额外的表达式 问题是 即使使用正确的正则表达式 也可以在测试器中拾取该行 例如ht
  • 删除字符串中的所有 HTML 标签(使用 jquery text() 函数)

    是否可以使用 jquery text 函数删除字符串中的所有 HTML 带有 HTML 标签的字符串 myContent div Hello span world span div 结果必须是 Hello world var myConte
  • C# 中字符串类型最快(内置)比较是什么

    C 中字符串类型最快的内置比较方法是什么 我不介意印刷 语义含义 目的是在排序列表中使用比较器以便在大型集合中快速搜索 我认为只有两种方法 Compare and CompareOrdinal 什么是最快的 此外 是否有更快的字符串比较方法
  • 拍照后编辑图像

    我目前正在制作一个 iPhone 应用程序 用户可以在其中拍照或从相册中选择照片 然后将覆盖层放置在图像上 然后用户可以缩放 旋转和保存图像 目前 我可以拍照 或者选择一张放入相册 至于覆盖层 我只是使用 UIImageView 并将其放置
  • AngularJS:AppLevel 控制器可能吗?

    我有一个控制器 它是我的页面的控制器 但我想知道是否有可能有一个 AppLevel 控制器 即可以从每个页面访问的东西 所以每个页面实际上会分配超过 1 个控制器 我知道我可能可以通过服务来做到这一点并注入服务 但我希望有某种可以分配的应用
  • x86_64 将 64 位寄存器减少到 32 位并保留零或非零状态的最佳方法

    我正在寻找最快 最节省空间的方法 将 64 位寄存器减少为 32 位寄存器 仅保留 64 位寄存器的零 非零状态 我目前适用于所有价值观的最佳想法是popcntq 1c tput 主流 Intel 上的 3c 延迟 5 字节代码大小 rax
  • 对一个列表与另一个列表 ID 进行排序

    我有一个包含一些标识符的列表 如下所示 List
  • 如何通过 jq 的“join”函数使用换行符 (\n) 和制表符 (\t) 等非显示字符

    我在互联网上找不到这个 所以我想将其添加为文档 我想在非显示字符周围加入一个 json 数组 30 RecordSeparator 这样我就可以在 bash 中安全地迭代它 但我不太清楚该怎么做 我试过echo one two three