2012-03-12 13 views
14

प्रतिस्थापित करें मैं कमांड लाइन लाइन का उपयोग कर एक बहु-पंक्ति फ़ाइल में टेक्स्ट को प्रतिस्थापित करने का प्रयास कर रहा हूं। मैं उबंटू नट्टी का उपयोग कर रहा हूं।पर्ल कमांड लाइन मल्टी-लाइन

[mysqld] 
# 
# * Basic Settings 
# 

# 
# * IMPORTANT 
# If you make changes to these settings and your system uses apparmor, you may 
# also need to also adjust /etc/apparmor.d/usr.sbin.mysqld. 
# 

user   = mysql 
socket   = /var/run/mysqld/mysqld.sock 
port   = 3306 
basedir   = /usr 
datadir   = /var/lib/mysql 
tmpdir   = /tmp 
skip-external-locking 

नीचे मेरी पर्ल आदेश है:

perl -i -pe "s/(\[mysqld\][^\^]+)/\1\nsometext/g" test.txt 

हालांकि, बजाय फ़ाइल में सभी पाठ की जगह की

नीचे मेरी पाठ फ़ाइल (बुलाया test.txt) की सामग्री है

[mysqld] 

sometext# 
# * Basic Settings 
# 

# 
# * IMPORTANT 
# If you make changes to these settings and your system uses apparmor, you may 
# also need to also adjust /etc/apparmor.d/usr.sbin.mysqld. 
# 

user   = mysql 
socket   = /var/run/mysqld/mysqld.sock 
port   = 3306 
basedir   = /usr 
datadir   = /var/lib/mysql 
tmpdir   = /tmp 
skip-external-locking 
# 

मैं पर्ल के लिए RegexBuddy में Regex की कोशिश की और यह मेल: नीचे दिए गए है कि मैं क्या अंत है पाठ फ़ाइल में सब कुछ है, लेकिन किसी कारण से यह कमांड लाइन पर perl का उपयोग कर काम नहीं कर रहा है।

मैं कुछ सहायता की सराहना करता हूं।

अग्रिम धन्यवाद।

+5

मुझे यकीन नहीं है कि अपेक्षित परिणाम क्या होना चाहिए। – cornuz

+0

@cornuz मुझे लगता है कि सवाल से स्पष्ट है। मैंने कहा "फ़ाइल में सभी पाठों को बदलने की जगह, [निम्नलिखित] मैं इसके साथ समाप्त होता हूं ..." ताकि यह काफी समझा सके। नियमित अभिव्यक्ति से भी मुझे लगता है कि यह स्पष्ट रूप से स्पष्ट लगता है कि मुझे क्या परिणाम चाहिए। –

उत्तर

24

आप फ़ाइल लाइन-दर-लाइन पढ़ रहे हैं, इसलिए केवल पहली पंक्ति आपके रेगेक्स से मेल खाती है। आप क्या करना चाहते हैं - यदि आप वास्तव में अधिकांश सामग्री को हटाना चाहते हैं - -0 विकल्प का उपयोग कर फ़ाइल को स्लर्प करना है, उदा। -0777। यह लाइन एंडिंग प्रसंस्करण है, और 777 केवल एक संख्या है जो सम्मेलन द्वारा पर्याप्त रूप से एक ऑक्टल संख्या के रूप में उपयोग की जाती है ताकि फ़ाइल स्लिपिंग का कारण बन सके।

perl -0777 -i -pe 's/(\[mysqld\][^\^]+)/$1\nsometext/g' test.txt 

इसके अलावा, मैंने आपके उद्धरणों को प्रतिस्थापित किया। यदि आप * निक्स में हैं, जो आपको लगता है कि, एकल उद्धरण बेहतर हैं। मामले में मामला, $1 खोल द्वारा interpolated नहीं किया जाएगा।

+0

आपको बहुत बहुत धन्यवाद। मुझे इसे संशोधित करना था: 'perl -0777 -i -pe "s/(\ [mysqld \] [^ \ ^] +)/\ 1 \ nsometext/g" test.txt' क्योंकि मैं जा रहा हूं बाद में कुछ खोल चर का उपयोग करने की आवश्यकता है। चीयर्स। –

+0

@ChuckUgwuh मदद करने के लिए खुशी हुई। – TLP

+0

चीयर्स। क्या आप जानते हैं कि मैं सिंगल कोट्स का उपयोग करके शैल चर शामिल कैसे कर सकता हूं ?! डबल-कोट्स में मैं ऐसा कुछ करता हूं: 'perl -0777 -i -pe "s/(\ [mysqld \] [^ \ ^] +)/\ 1 \ n $ var/g" test.txt', यह यह जानकर अच्छा लगेगा कि मैं सिंगल कोट्स का उपयोग करके एक ही चीज़ कैसे प्राप्त कर सकता हूं ?! एक बार फिर धन्यवाद। –

5

-p switch पर्ल इनपुट के हर लाइन से अधिक पुनरावृति और उनमें से प्रत्येक के लिए दिए गए कोड को निष्पादित (और बाद में लाइनों मुद्रित करने के लिए) का कारण बनता है।

LINE: while (<>) { 
    SOME_CODE_HERE; 
} continue { 
    print or die "-p destination: $!\n"; 
} 

आपका regexp ही बार में कई लाइनों मिलान करने के लिए है, जो स्पष्ट रूप से काम नहीं करेगा अगर पर्ल है इरादा किया जा रहा है: विशेष रूप से, आदेश

perl -p -e 'SOME_CODE_HERE;' 

वास्तव में निम्नलिखित पर्ल कार्यक्रम चलाने के बराबर है लाइन द्वारा इनपुट लाइन प्रसंस्करण। के रूप में इरादा यह काम करने के लिए, आप (कम से कम) दो विकल्प: क्या -0NNN switch का उपयोग करके एक लाइन का गठन किया की

  1. पर्ल के बदले धारणा। विशेष रूप से, स्विच -0777 पर्ल को प्रत्येक इनपुट फ़ाइल को एक "लाइन" के रूप में मानने का कारण बनता है।

  2. उदा। अपने कोड को फिर से लिखें .. flip-flop operator का उपयोग करें।

वैसे, मुझे दृढ़ता से संदेह है कि आपके regexp का मतलब यह नहीं है कि इसका मतलब क्या है। विशेष रूप से, [^\^]+ एक या अधिक वर्णों की एक स्ट्रिंग से मेल खाता है जिसमें कैरेट नहीं है (^)। चूंकि आपके इनपुट में कोई भी कैरेट होने की प्रतीत नहीं होती है, इसलिए यह (?s:.+) (या केवल .+) के बराबर लगता है यदि आप /s modifier का उपयोग करते हैं)।

+0

धन्यवाद। जैसा कि आपके उत्तर से पता चलता है, मैं कमांड लाइन के साथ पूरी तरह से समझदार नहीं हूं, लेकिन मुझे यह काफी शिक्षित लगता है। चियर्स –