有没有办法在 bash 中获取未解释的字符串 - 它可以包含单引号和双引号以及 Bang!等?
我想做类似的事情
#!/bin/bash
echo -e "Line One\nLine Two\nLine three" | python -c """
import sys
for line in sys.stdin.readlines():
print "STDIN: %s" %line
""" | awk '{print $2}'
问题是打印了零 STDIN:行 - stdin 没有通过管道传输到 python 程序。
这是一个用例:注意输入大小可以是低 GB 的大小:
cat“my10GBfile.dat”|python-c“”..等
现在在其中使用 HEREDOC。例如
#!/bin/bash
echo -e "Line One\nLine Two\nLine three" | python<<-HERE
some
multiline
python
program
HERE
| awk '{print $2}'
存在 stdin 被占用的问题 - 因此输入丢失。
我真正想要的是 bash 中未解释的多行字符串。
答案1
定理做提供未解释的多行字符串(至少如果你引用了分隔符);根本没有(简单)的方法来访问其内容。
由于 STDIN 已被用于其他用途,您可以创建一个新的文件描述符以将 heredoc 的内容传递给 python:
exec 3<<'HERE'
import sys
print "Line Zero!\n"
for line in sys.stdin:
print line
HERE
echo -e "Line One\nLine Two\nLine Three" | python /dev/fd/3
答案2
无需任何花哨:只需单引号多行字符串即可:
echo -e "Line One\nLine Two\nLine three" | python -c '
import sys
for line in sys.stdin.readlines():
print "STDIN: %s" %line
' | awk '{print $2}'
答案3
怎么样(使用< <()
Bash 构造来模拟逐行输入):
$ while read i; do echo -e '
#this is a multiline python program
if True:
print """line: '"$i"'"""
' | python | awk '{print $0, "→", $3}'; done < <(echo -e "Line One\nLine Two\nLine Three")
输出结果为:
line: Line One → One
line: Line Two → Two
line: Line Three → Three
使用 Python 的内部"""
语法,字符串将受到除三个引号之外的所有内容的保护。以read
这种方式使用将为每一行调用一次 Python 程序。这在您给出的示例中有效,但您的实际任务可能有所不同(这就是我在评论中要求提供具体示例的原因)。也许引用“技巧”无论如何都可能有用。
如果要使用 Python,那么在 Python 代码中完成所有操作似乎更容易;毕竟它是一种称职的脚本语言。