bash中的原始多行字符串?


1

有没有办法在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的大小:

猫“ 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}'

有一个问题,即标准输入被采用-因此输入丢失。

我真正想要的是bash中未解释的多行字符串。


您能否举一个更接近于您实际想要做的例子,即理论上少一点和实践上一点?我发现,到目前为止,您要完成的工作存在一些歧义(您说STDIN丢失了,但是您没有说明应如何使用它-某些特定任务可能有解决方法)。
Daniel Andersson

@Daniel我在python中添加了print语句,并解释说它们不打印任何内容。
javadba

请注意,自然的方法是直接从Python内部访问文件。您很可能可以直接在本机Python中使用AWK和其他CLI工具执行所有操作,并且可能会大大提高速度。该外壳功能强大,但是当混合中已经添加了更完整的脚本语言(通常是Perl / Python)时,就可以发挥更大的功能。如果Python函数很简单,则另一种可能性是扩展AWK以在脚本中执行其职责并将文件名直接传递给AWK。cat以这种方式使用很少是“正确的”方法。
Daniel Andersson

@Daniel。原则上不要不同意。我在几百到低K的行中都有python脚本。有时已经将东西编码在带壳的东西中,不想干扰它们,只需插入一个步骤,在这种情况下,python也是一个选择。
javadba

Answers:


3

Heredoc 确实提供了未解释的多行字符串(至少在您引用分隔符的情况下);只是没有(简便)的方式来访问其内容。

由于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

这可能正是我要寻找的:我一直在考虑管道,但是文件描述符对脚本本身是透明的。我会尝试的!
javadba

效果很好。thx
javadba

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}'

0

怎么样(使用< <()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代码中进行所有操作似乎更加容易。毕竟,它是一种有能力的脚本语言。


感谢您的回复。我的用例涉及的行数在数百到几百万之间,因此重新启动python每行并不是最佳选择。输入将是低GB的目录文件。
javadba

我在上面添加了用例。
javadba
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.