Python эквивалентно Perl -pe? - PullRequest
       33

Python эквивалентно Perl -pe?

13 голосов
/ 21 октября 2011

Мне нужно выбрать некоторые цифры из некоторых текстовых файлов. Я могу выбрать нужные мне строки с помощью grep, но не знаю, как извлечь числа из строк. Коллега показал мне, как это сделать из bash с perl:

cat results.txt | perl -pe 's/.+(\d\.\d+)\.\n/\1 /'

Однако я обычно пишу на Python, а не на Perl. Итак, мой вопрос, мог ли я использовать Python таким же образом? Т.е., мог ли я передать что-то из bash в Python, а затем получить результат прямо в stdout? ... если это имеет смысл. Или Perl просто удобнее в этом случае?

Ответы [ 6 ]

11 голосов
/ 21 октября 2011

Да, вы можете использовать Python из командной строки. python -c <stuff> будет запускаться <stuff> как код Python. Пример:

python -c "import sys; print sys.path"

Нет прямого эквивалента опции -p для Perl (автоматическая построчная обработка ввода / вывода), но это в основном потому, что Python не использует ту же концепцию $_ и еще много чего. что делает Perl - в Python весь ввод и вывод выполняется вручную (через raw_input() / input() и print / print()).


Для вашего конкретного примера:

cat results.txt | python -c "import re, sys; print ''.join(re.sub(r'.+(\d\.\d+)\.\n', r'\1 ', line) for line in sys.stdin)"

(Очевидно, это несколько громоздко. Возможно, лучше просто написать скрипт, чтобы сделать это на реальном Python.)

2 голосов
/ 21 октября 2011

Вы можете использовать:

$ python -c '<your code here>'
1 голос
/ 21 октября 2011

У вас есть проблема, которую можно решить несколькими способами.

Я думаю, вам следует подумать об использовании регулярного выражения (что делает perl в вашем примере) непосредственно из Python.Регулярные выражения находятся в модуле re.Примером может быть:

import re
filecontent = open('somefile.txt').read()
print re.findall('.+(\d\.\d+)\.$', filecontent)

(я бы предпочел использовать $ вместо '\ n' для окончания строки, потому что окончания строк различаются в операционных системах и кодировках файлов)

Если вы хотите вызывать команды bash из Python, вы можете использовать:

import os
os.system(mycommand)

Где команда - команда bash.Я использую его все время, потому что некоторые операции лучше выполнять в bash, чем в Python.

Наконец, если вы хотите извлечь числа с помощью grep, используйте параметр -o, который печатает только совпадающиечасть.

1 голос
/ 21 октября 2011

Теоретически, вы можете, но Python не имеет такого большого количества магии регулярных выражений, как Perl, поэтому получающаяся команда будет намного более громоздкой, особенно если вы не можете использовать регулярные выражения без импорта re ( вам, вероятно, понадобится sys для sys.stdin).

Эквивалент Python для однострочной строки вашего коллеги составляет примерно:

import sys, re
for line in sys.stdin:
    print re.sub(r'.+(\d\.\d+)\.\n', r'\1 ', line)
0 голосов
/ 21 октября 2011

Perl (или sed) более удобен.Однако это возможно, если некрасиво:

python -c 'import sys, re; print "\n".join(re.sub(".+(\d\.\d+)\.\n","\1 ", l) for l in sys.stdin)'
0 голосов
/ 21 октября 2011

Вы можете использовать python для выполнения кода непосредственно из командной строки bash, используя python -c, или вы можете обрабатывать ввод по каналу в stdin, используя sys.stdin, см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...