bash 中的原始多行字符串?

bash 中的原始多行字符串?

有没有办法在 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 代码中完成所有操作似乎更容易;毕竟它是一种称职的脚本语言。

相关内容