【发布时间】:2017-06-23 18:31:56
【问题描述】:
给定一个文件名,我想编写一个 shell 脚本,它发出以下内容,并将其通过管道传输到一个进程中:
Content-Length:<LEN><CR><LF>
<CR><LF>
{ "jsonrpc":"2.0", "params":{ "text":"<ESCAPED-TEXT>" } }
其中<ESCAPED-TEXT> 是文件的内容,但它的 CR、LF 和引号已转义为 \r 和 \n 和 \"(我猜所有其他 JSON 转义最终也将被需要) ),其中<LEN> 是包含转义文本的最终 JSON 行的长度。
这是我当前的 bash 脚本解决方案。它可以工作,但很丑陋。
(
TXT=`cat ~/a.py | sed -E -e :a -e '$!N; s/\n/\\\n/g; ta' | sed 's/"/\\\"/g'`
CMD='{"jsonrpc":"2.0", "params":{ "text":{"'${TXT}'"}} }'
printf "Content-Length: ${#CMD}\r\n\r\n"
echo -n "${CMD}"
) | pyls
谁能建议如何做这个清洁剂?
此 sed 脚本仅替换 LF,而不是 CR。它将每一行累积到缓冲区中,然后执行
s//g以替换其中的所有LF。我想不出任何在 Linux 和 OSX/BSD 上仍然有效的更简洁的方法。我同时使用了 printf 和 echo。首先 printf 因为我 确实 想在 Content-Length 标头之后发出 CRLFCRLF ,而您显然需要 printf ,因为带有转义的 echo 的行为在整个过程中并不统一平台。接下来 echo 因为我不希望 TXT 中的
\r和\n文字不转义,而 printf 会这样做。
上下文:有一个标准叫做“语言服务器协议”。基本上你运行类似pyls 我在这里运行的东西,然后你通过标准输入将JsonRPC 传递给它,然后它通过管道返回东西。不同的人为 Python(我在这里使用的 pyls)、C#、C++、Typescript、PHP、OCaml、Go 和 Java 编写了语言服务器,每个人都倾向于在他们的自己的语言。
我想编写一个测试工具,它可以将一些示例 JsonRPC 数据包发送到任何此类服务器。
我认为最好只用开箱即用的所有平台上可用的通用基本 shell 脚本编写我的测试工具。这样每个人都可以在他们的语言服务器上使用我的测试工具。 (如果我改为在 Python 上编写它,比方说,它会更容易编写,但它会迫使 C# 人学习 + 安装 python 只是为了运行它,以及 Typescript、PHP、OCaml、Go 和其他伙计们。)
【问题讨论】: