linux 命令行:如何简单地将任意字符串输入管道?
linux command line: How can simply feed arbitrary strings to pipe?
我正在寻找一个非常简单的技巧:
假设在文件error.txt
中,有一个很长的字符串:
{"errorMessage": "....", "key1": "some message...", "key2": "message 2 ...", ....}
因为它的格式不是 reader 友好的,如果我想在终端中以格式良好的形式查看它,我可以这样做:cat error.txt | jq
这将以 reader 友好的形式在终端中打印字符串。
但是,如果我只是复制和粘贴了那么长的字符串,并且我不想经历将其粘贴到 txt 文件中的麻烦,我想立即格式化并查看它。类似于:
cat {"errorMessage": "....", "key1": "some message...", "key2": "message 2 ..."} | jq
其中字符串不是在文件中,而是实时直接粘贴到命令行中?
如何将任意类型的字符串输入管道?
答案是<<<${my_string}
语法
jq <<<'{"errorMessage": "....", "key1": "some message...", "key2": "message 2 ..."}'
它可以用来发送任何命令的stdin
,不需要多余的echo:ing。我一直在脚本中使用它来解析变量的内容。
简单明了的解决方案是,如果信息可以表示为字符串,您可以通过一种或另一种方式将信息粘贴到标准输入上。
echo "your data here" | cmd
cmd <<<"your data here" # bash only
cmd <<\____EOF # this is called a "here document"
your data here
____EOF
None 这是管道特有的。
完全任意数据的正确解决方案可能看起来略有不同,因为无法将随机字节表示为字符串。如果字符编码和您的语言环境允许,几乎 每个字节都可以嵌入到字符串中(ISO-8859-1 有这个 属性;UTF-8 没有)但是空字节不能在 shell.
中表示为它们自己
Bash 提供了一种通过使用称为“C 字符串”的扩展来指定几乎任意字符串的方法(在 C 语言中,您可以指定带有反斜杠后跟八进制数的任意字节,以及一系列预定义符号,例如制表符 \t
、换行符 \n
、铃声字符 \a
等),但这也被限制为 non-null 字节(其中任何空值将被悄悄丢弃!):
echo $'[=11=]0[=11=]0[=11=]0' | wc
1 0 1
(注意输出如何显示空字节被截断)或者您可以自己执行编码:
echo ___ | tr _ '[=12=]0' | wc
echo AAAACg== | base64 -d | wc
printf '[=12=]0[=12=]0[=12=]0\n' | wc
另请注意,printf
比 echo
更通用,这是很常见的情况。
也许我还应该提到 iconv
,因为这是表示无效 UTF-8 字符串的相当常见的用例。
echo möjibäkë | iconv -f utf-8 -t iso8859-1
我正在寻找一个非常简单的技巧:
假设在文件error.txt
中,有一个很长的字符串:
{"errorMessage": "....", "key1": "some message...", "key2": "message 2 ...", ....}
因为它的格式不是 reader 友好的,如果我想在终端中以格式良好的形式查看它,我可以这样做:cat error.txt | jq
这将以 reader 友好的形式在终端中打印字符串。
但是,如果我只是复制和粘贴了那么长的字符串,并且我不想经历将其粘贴到 txt 文件中的麻烦,我想立即格式化并查看它。类似于:
cat {"errorMessage": "....", "key1": "some message...", "key2": "message 2 ..."} | jq
其中字符串不是在文件中,而是实时直接粘贴到命令行中?
如何将任意类型的字符串输入管道?
答案是<<<${my_string}
语法
jq <<<'{"errorMessage": "....", "key1": "some message...", "key2": "message 2 ..."}'
它可以用来发送任何命令的stdin
,不需要多余的echo:ing。我一直在脚本中使用它来解析变量的内容。
简单明了的解决方案是,如果信息可以表示为字符串,您可以通过一种或另一种方式将信息粘贴到标准输入上。
echo "your data here" | cmd
cmd <<<"your data here" # bash only
cmd <<\____EOF # this is called a "here document"
your data here
____EOF
None 这是管道特有的。
完全任意数据的正确解决方案可能看起来略有不同,因为无法将随机字节表示为字符串。如果字符编码和您的语言环境允许,几乎 每个字节都可以嵌入到字符串中(ISO-8859-1 有这个 属性;UTF-8 没有)但是空字节不能在 shell.
中表示为它们自己Bash 提供了一种通过使用称为“C 字符串”的扩展来指定几乎任意字符串的方法(在 C 语言中,您可以指定带有反斜杠后跟八进制数的任意字节,以及一系列预定义符号,例如制表符 \t
、换行符 \n
、铃声字符 \a
等),但这也被限制为 non-null 字节(其中任何空值将被悄悄丢弃!):
echo $'[=11=]0[=11=]0[=11=]0' | wc
1 0 1
(注意输出如何显示空字节被截断)或者您可以自己执行编码:
echo ___ | tr _ '[=12=]0' | wc
echo AAAACg== | base64 -d | wc
printf '[=12=]0[=12=]0[=12=]0\n' | wc
另请注意,printf
比 echo
更通用,这是很常见的情况。
也许我还应该提到 iconv
,因为这是表示无效 UTF-8 字符串的相当常见的用例。
echo möjibäkë | iconv -f utf-8 -t iso8859-1