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.

Вот пример использования: обратите внимание, что размер ввода может быть небольшим размером ГБ:

кот "my10GBfile.dat" | python -c "" ".. и т. д.

Теперь с помощью HEREDOC там .eg

#!/bin/bash

echo -e "Line One\nLine Two\nLine three" | python<<-HERE
some

multiline
python 
program
HERE
| awk '{print $2}'

есть проблема, что stdin получает в связке - и, следовательно, ввод теряется.

Что я действительно хочу, так это не интерпретируемая многострочная строка в bash.

3 ответа3

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
1

Не нужно ничего придумывать: просто заключите в кавычки многострочную строку:

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; это ведь грамотный скриптовый язык.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .