2012-12-24 4 views
6

मैं एक पर्ल स्क्रिप्ट है कि दूसरे के साथ एक स्ट्रिंग की जगह चल रहा था जब जावा प्रोग्राम से लागू नहीं चलता है:पर्ल स्क्रिप्ट टर्मिनल में चलता है, लेकिन

perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt 

जब मैं टर्मिनल से यह आदेश चला यह अच्छी तरह से सभी को बदल देता है str1 की 0 दी गई फ़ाइल में str2 पर होने वाली घटनाएं। जब मैं जावा से चलाने यह फ़ाइल का उपयोग करता है, लेकिन कोई प्रतिस्थापन होती है:

Runtime.getRuntime().exec("perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt"); 
  • मुझे यकीन है कि यह फ़ाइल पर पहुंचकर (फ़ाइल जीएडिट में संपादित किया जा रहा है (आवश्यक पुनः लोड)) हूँ।
  • मैंने जावा ProcessBuilder कक्षा की कोशिश की लेकिन एक ही परिणाम होता है।
  • जब मैं अन्य आदेशों के साथ Runtime.exec() या ProcessBuilder का उपयोग करता हूं (जैसे gedit newFile.txt) वे अच्छी तरह से काम करते हैं।
  • विडंबना यह है कि मैंने जावा से उपरोक्त पर्ल कमांड मुद्रित किया है और पेस्ट टर्मिनल में ले लिया है और प्रतिस्थापन ऑपरेशन किया गया है!
  • उन आदेशों का उपयोग करके कोई अपवाद या त्रुटियां नहीं। (मैंने यह सुनिश्चित करने के लिए कोशिश की और पकड़ लिया)।
  • मैंने cml में perl के बजाय /usr/bin/perl का उपयोग किया ताकि यह सुनिश्चित किया जा सके कि perl cmd निष्पादित किया गया हो।

तो आपको क्या लगता है कि समस्या है?

संपादित करें:

मैं सिर्फ जावा में आदेश से उद्धरण चिह्न निकाल इस समस्या का समाधान। मदद के लिए @ikegami के लिए धन्यवाद। तो काम कर संस्करण है:

perl -pi.back -e s/str1/str2/g; path/to/file1.txt 

बजाय

perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt 
+0

'exec()' आपको 'प्रक्रिया 'देता है, इसमें' getInputStream() 'और' getErrorStream() 'विधियां हैं जो आपको प्रक्रिया के उत्पादन के आउटपुट को वापस लौटाती हैं। देखें कि यह प्रक्रिया क्या आउटपुट करती है। –

+1

ओएस के आधार पर, आपके जावा प्रोग्राम में शायद पर्ल का मार्ग नहीं है। आपको पर्ल बाइनरी में पूरा पथ डालना होगा। ऐसा करने का यह एकमात्र तरीका नहीं है, लेकिन सबसे सरल तरीकों में से एक है। – octopusgrabbus

+0

@DenisTulskiy मैंने पहले ही यह किया है। वे कुछ भी आउटपुट नहीं करते हैं। – a90

उत्तर

5

execStringTokenizer का उपयोग करता है आदेश, जो जाहिरा तौर पर सिर्फ खाली स्थान के पर विभाजन पार्स करने के लिए। उदाहरण के लिए

लें निम्नलिखित शेल कमांड (समान है, लेकिन तुम्हारा से अलग हो):

  • perl (आदेश)
  • :

    perl -pi.back -e 's/a/b/g; s/c/d/g;' path/to/file1.txt 
    

    यह के लिए, StringTokenizer निम्न आदेश और तर्क का उत्पादन -pi.back

  • -e
  • 's/a/b/g;
  • s/c/d/g;'
  • path/to/file1.txt

कि पूरी तरह से गलत है।कमान और तर्क होना चाहिए

  • perl (आदेश)
  • -pi.back
  • -e
  • s/a/b/g; s/c/d/g; (उद्धरण की कमी पर ध्यान दें।)
  • path/to/file1.txt

आप उन गुजर सकता है exec(String[] cmdarray) से ऊपर।

  • sh (आदेश)
  • -c
  • perl -pi.back -e 's/a/b/g; s/c/d/g;' path/to/file1.txt: या यदि आप आदेश को पार्स करने का विकल्प नहीं है, आप वास्तव में एक खोल आप के लिए यह पार्स करने के लिए निम्नलिखित exec(String[] cmdarray) को पास करके आह्वान सकता
+0

आपको @ARGV 'perl -pi.back -e's/str1/str2/g;' के लिए 'perl -le'print' आज़माएं पथ/से/file1.txt' और देखें कि वास्तव में शेल द्वारा पर्ल को क्या पारित किया जाता है। आपको '-e' के बाद (अनावश्यक) स्थान के बिना भी कोशिश करनी चाहिए। – ikegami