AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 459419
Accepted
Daniel Kaplan
Daniel Kaplan
Asked: 2018-07-31 10:09:17 +0800 CST2018-07-31 10:09:17 +0800 CST 2018-07-31 10:09:17 +0800 CST

为什么空格作为换行符回显?

  • 772

我有这样的 JSON 数据:

[
  {
    "loginId": "7638749",
    "customerprofileDetails": {
      "securityQuestions": [
        "What is your favorite sports team?",
        "What is your favorite song?",
        "Who is your favorite artist?"
      ]
    }
  }
]

我有一个脚本,我将该文件作为第一个参数传入。脚本如下所示:

for json in `cat $PWD/$1 | jq -cr '.[]'` ; do
    echo "$json"
done

出于某种原因,当我运行此脚本时,它会输出以下内容:

> fileFromJson.sh tmp2.json
{"loginId":"7638749","customerprofileDetails":{"securityQuestions":["What
is
your
favorite
sports
team?","What
is
your
favorite
song?","Who
is
your
favorite
artist?"]}}

为什么那里有那些换行符,是什么导致了这个问题?当我刚刚运行时cat $PWD/tmp2.json | jq -cr '.[]',它会打印在一行上。如果这很重要,我正在使用 MacOS。

bash echo
  • 2 2 个回答
  • 4394 Views

2 个回答

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2018-07-31T10:33:55+08:002018-07-31T10:33:55+08:00

    不带引号的命令替换`cat $PWD/$1 | jq -cr '.[]'`执行以下操作:

    1. 运行命令cat $PWD/$1 | jq -cr '.[]'。顺便说一句,这是一种过于复杂的写作方式,除了如果包含某些特殊字符或者是绝对路径jq -cr '.[]' <"$1",这个变体不会中断。$1
    2. 将生成的字符串分成空格分隔的部分。您的问题不是很清楚,但您似乎期望换行符分隔的部分 - 这不是未引用的替换所做的。
    3. 将每个片段视为通配符模式,如果它匹配一个或多个文件名,则将该片段替换为匹配的文件名列表。

    第 2 步和第 3 步通俗地称为“split+glob 运算符”,这几乎不是您想要的。除非您确切知道为什么需要省略引号,否则请始终在变量和命令替换周围使用双引号。

    要在 shell 中逐行处理文件,请使用while read循环:

    jq -cr '.[]' <"$1" |
      while IFS= read -r line; do
        printf '%s\n' "$line"
      done
    

    但是你最好不要使用其他工具。Shell 本身并不擅长处理大量的字符串数据。

    • 4
  2. confetti
    2018-07-31T10:19:22+08:002018-07-31T10:19:22+08:00

    默认情况下,echo始终输出尾随换行符。

    您可以将-n参数传递给以echo防止它这样做。

    来自man echo:

    -n 不输出尾随换行符

    编辑:

    这里的“问题”不在您的cat $PWD/$1 | jq -cr '.[]'命令中,而是echo在行本身,或者更准确地说,在for循环中。使用for循环,您将jq逐字拆分传递给它的内容(命令的输出)。

    因此,本质上,您将每个由空格分隔的单个字符串逐个传递给 echo 命令,默认情况下,每次执行时都会添加一个尾随换行符。

    • 0

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve