2008-12-14 15 views
15

मुझे python -c '<code>' पता है, लेकिन मुझे आश्चर्य है कि perl -pi -e '<code>' के बराबर एक और सुरुचिपूर्ण पायथन है। मैं अभी भी पूरी निर्देशिका में खोजने और प्रतिस्थापित करने जैसी चीजों के लिए इसका उपयोग करता हूं (perl -pi -e s/foo/bar/g * या यहां तक ​​कि find . | xargs perl -pi -e s/foo/bar/g उप-निर्देशिकाओं के लिए)।क्या कोई पाइथन `perl -pi -e` के बराबर है?

मुझे वास्तव में लगता है कि जो पर्ल पर्ल (फ्री फॉर्म टिम टॉडी-नेस) बनाता है वह perl -pi -e इतना अच्छा काम करता है, जबकि पाइथन के साथ आपको फिर से मॉड्यूल आयात करने के साथ कुछ करना होगा, फिर उदाहरण दें और फिर stdin पर कब्जा करें, लेकिन शायद एक पायथन शॉर्टकट है जो सब कुछ करता है और मुझे याद आया (इसे बहुत याद किया गया है) ...

+2

सचमुच, ऐसा लगता है कि गिडो कुछ स्वीकार नहीं करेगा। – Axeman

+0

निश्चित रूप से आप पाते हैं। -प्रकार एफ | xargs perl ...? –

+0

आप इसके बजाय रूबी का उपयोग कर सकते हैं। रूबी में, 'perl -pi -e' के समतुल्य 'ruby -pi -e' है। [इस लिंक] पर क्लिक करें (http://stackoverflow.com/questions/1274605/ruby-search-file-text-for-a-pattern-and-replace-it-with-a-given-value#3502884) और अधिक के लिए जानकारी। – unforgettableid

उत्तर

9

'python -h' से कमांड लाइन उपयोग निश्चित रूप से दृढ़ता से सुझाव देता है कि ऐसा कोई समकक्ष नहीं है। पर्ल '$_' का व्यापक उपयोग करने के लिए जाता है (आपके उदाहरण इसका निहित उपयोग करते हैं), और मुझे नहीं लगता कि पाइथन किसी भी समान अवधारणा का समर्थन करता है, जिससे पर्ल एक-लाइनर के पायथन समकक्षों को बहुत कठिन बना दिया जाता है।

24

पायथन मुगलों के लिए है। यदि आप चाहते हैं जादू, पर्ल आप का उपयोग करना चाहिए!

10

पाइथन में लिखना मुश्किल नहीं है।

  1. अपने आप को एक -पी और -i सुविधाओं के साथ एक आसान मॉड्यूल लिखें जो आपको वाकई पसंद है। आइए इसे pypi.py पर कॉल करें।

  2. उपयोग python -c 'import pypi; pypi.subs("this","that")'

आप fileinput मॉड्यूल के साथ बुनियादी -p पाश लागू कर सकते हैं।

आपके पास एक फ़ंक्शन, subs होगा जो फ़ाइल खोलने के लिए आवश्यक "-i" एल्गोरिदम लागू करता है, बैकअप प्रति सहेजता है, और प्रत्येक पंक्ति पर विकल्प कर रहा है।

इस तरह कुछ सक्रिय व्यंजन हैं।

नहीं निर्मित: यहाँ कुछ कर रहे हैं। लेकिन लिखना मुश्किल नहीं है। और एक बार अनुकूलित करने के लिए आसान लिखा है।

+3

मैं सुझाव दूंगा कि मॉड्यूल को pi.py कहा जाता है, साइट-पैकेज निर्देशिका के अंदर संग्रहीत किया जाता है, 'if __name__ == "__main __":' निर्माण के साथ समाप्त होता है, और फिर 'python -mpi के साथ बुलाया जाता है ... ' – tzot

6

मुझे लगता है कि पर्ल स्प्रिंग स्क्रिप्टिंग पर इस तरह के लिए बेहतर अनुकूल है। यदि आप फ्लाई वन-ऑफ स्क्रिप्टिंग क्षमता पर त्वरित चाहते हैं तो मैं पर्ल, अजीब, sed, और मानक यूनिक्स कमांड लाइन टूल्स पर चिपकने की सलाह देता हूं।

लेकिन यदि आप पाइथन का उपयोग करने में रुचि रखते हैं, तो मैं अपना खुद का कमांड लाइन टूल्स लिखने और इसकी अनुशंसा करने के लिए optparse का उपयोग करता हूं। ऑप्टपरसे मदद पीढ़ी में निर्मित एक स्वच्छ और उपयोग में आसान कमांड लाइन विकल्प पार्सर प्रदान करता है।

def myfunc(filename, use_versbose): 
    # function code 

if __name__ == '__main__': 
    from optparse import OptionParser 

    parser = OptionParser() 
    parser.add_option("-f", "--file", dest="filename", 
         help="write report to FILE", metavar="FILE") 
    parser.add_option("-q", "--quiet", 
         action="store_false", dest="verbose", default=True, 
         help="don't print status messages to stdout") 

    (options, args) = parser.parse_args() 

    if options.filename: 
     myfunc(options.filename, options.verbose) 

    else: 
     print 'ERROR -- Necessary command line options not given!' 
     print parser.print_help() 

पार्सर:

यहां एक नमूना है।print_help() निम्न उत्पादन उत्पन्न करता है, और जब -h या --help कमांड लाइन पर दिया जाता है स्वचालित रूप से प्रदर्शित किया जाता है:

usage: <yourscript> [options] 

options: 
    -h, --help   show this help message and exit 
    -f FILE, --file=FILE write report to FILE 
    -q, --quiet   don't print status messages to stdout 
+3

यह वास्तव में एक लाइनर के प्रतिस्थापन नहीं है, और इसलिए इनमें से अधिकांश प्रश्न –

+3

प्रश्न का उत्तर नहीं है, लेकिन शायद अधिक सुरुचिपूर्ण समाधान' perl -pi -e' के समतुल्य नहीं है , लेकिन अक्सर प्रदर्शन किए गए कार्यों के लिए अपने स्वयं के कमांड लाइन उपकरण लिखना। "myscript.py -x यह-" वह "python -c 'से साफ़ हो सकता है इसे आयात करें; dostuff (यह, वह)' '। यह आपकी व्यक्तिगत जरूरतों और प्राथमिकताओं पर निर्भर करता है। – monkut

2

fileinput मॉड्यूल में यथास्थान संपादन के लिए क्षमता है। हालांकि, आप बैकअप के साथ बांट नहीं सकते हैं। यहाँ कैसे एक एक लाइनर के लिए इसका इस्तेमाल करने की है:

python -c 'import fileinput, sys; for line in fileinput.input(inplace=True): sys.stdout.write(line, "foo", "bar")' 

व्यक्तिगत रूप से, मैं सिर्फ आम तौर पर पर्ल का उपयोग जब मैं कुछ इस तरह करने की जरूरत है। यह पर्ल का उपयोग करने के कुछ बार में से एक है।

9

मैं जानता हूँ कि यह कुछ साल बहुत देर हो चुकी है, लेकिन मैं हाल ही में जो आप के लिए वास्तव में क्या कहा है करता pyp नामक एक बहुत अच्छा उपकरण, मिल गया है।

मुझे लगता है कि अपने आदेश होना चाहिए:

pyp "p.replace('foo','bar')" 
+1

अच्छा लगता है! सोनी पिक्चर्स इमेजवर्क्स से, "पाइड पाइपर, पाइपिंग पाइथन पाइप"), बहुत संक्षिप्त, लचीला, आंकड़े, आंतरिक पाइपलाइन इत्यादि कर सकते हैं। यह पीकॉन 2012 "द पायड पाइपर: ए मॉडर्न पायथन टोबी रोसेन द्वारा अजीब, sed और अन्य यूनिक्स टेक्स्ट मैनिपुलेशन यूटिलिटीज के लिए वैकल्पिक " – nealmcb

0

ऊपर stdin के लिए काम कर सकते हैं, लेकिन नहीं लगती है जैसे कि यह एक फ़ाइल के लिए काम करेगा।

हो सकता है कि कुछ की तरह:

-

import fileinput 
import sys 
for line in fileinput.input("./poop", inplace=True): 
    line = line.replace("foo", "bar") 
    sys.stdout.write(line) 

- जहां "./poop" जहाँ आपकी फ़ाइल है और line.replace line.replace जैसी चीजों का समर्थन करना चाहिए साथ बदला जा सकता ("{}"। प्रारूप (चर), "newtext")

संबंधित मुद्दे