प्रोग्राम को केवल टर्मिनल का उपयोग करके कैसे संपादित करें?


13

मैं एक शेल स्क्रिप्ट लिखना चाहता हूं जिसके तहत मैं कमांड से फाइल पढ़ सकता हूं और मैनुअल हस्तक्षेप के बिना फाइल को संपादित कर सकता हूं (कुछ पाठ की खोज करने और इसे दूसरे के साथ बदलने के आधार पर)।

मुझे इसके लिए किसी भी पाठ संपादक का उपयोग करने की आवश्यकता नहीं है .... बस पाठ-खोज (जैसे grep का उपयोग करके) और फिर इसे किसी अन्य पाठ के साथ बदलने और परिवर्तनों को सहेजने के लिए ....

जवाबों:


10

वह जहां sedखेलने के लिए आता है। एक sedकमांड में यह प्रारूप है:

[pattern1][,pattern2][!] command [args]

यह regexes का उपयोग करता है इसलिए यह थोड़ा मुश्किल हो सकता है। नीचे दिए गए 2 लिंक से लिए गए कुछ बुनियादी उदाहरण:

# स्थानापन्न (प्रत्येक पंक्ति पर "बार" के साथ "फू" ढूंढें (बदलें और बदलें)
sed 's / foo / bar /' # एक पंक्ति में केवल 1 उदाहरण को बदलता है
sed 's / foo / bar / 4' # एक पंक्ति में केवल 4 वें उदाहरण को बदलता है
sed 's / foo / bar / g' # एक पंक्ति में सभी उदाहरणों को बदलता है
sed 's / \ ((। * \) foo \ ((। * foo \) / \ 1bar \ 2 /' # अगले-से-अंतिम मामले को बदलें
sed 's / \ ((। *) \ _ फू / \ 1bar /' # केवल अंतिम मामले को बदलें

# विकल्प "फू" "बार" के साथ केवल उन लाइनों के लिए जिनमें "बाज" हैं
sed '/ baz / s / foo / bar / g'

"विकल्प" फू "के साथ" बार "उन लाइनों के लिए EXCEPT जिसमें" बाज "होते हैं
sed '/ baz / s / foo / bar / g'

# परिवर्तन "लाल" या "रूबी" या "puce" को "लाल"
sed 's / स्कारलेट / लाल / जी; s / रूबी / लाल / जी; s / puce / लाल / g' 'अधिकांश
grew's / scarlet \ | ruby ​​\ | puce / red / g '# GNU sed केवल

कुछ संदर्भ


7

बहुत देर से जवाब। हालाँकि, यह एक समान समस्या / प्रश्न के साथ दूसरों की मदद कर सकता है।

मैं एक पैच बनाने और लगाने की सलाह दूंगा। एक अच्छा उदाहरण यहाँ पाया जा सकता है

उदाहरण के लिए, यह मानते हुए कि एक नई। Txt फ़ाइल में वे परिवर्तन हैं, जिन्हें आप पुराने पर लागू करना चाहते हैं। आप किसी टर्मिनल पर या पैच_फाइल.श बनाकर या निष्पादित करके कमांड निष्पादित कर सकते हैं।

कमांड लाइन: एक टर्मिनल खोलें और नीचे दी गई लाइनों को कॉपी और निष्पादित करें (फ़ाइल नामों को आवश्यकतानुसार बदलें):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

स्क्रिप्ट: .sh फ़ाइल दृष्टिकोण का उपयोग करना। एक टर्मिनल में (कीबोर्ड: ctrl + alt + t: gedit patch_file.sh

टर्मिनल पर जाने वाली कमांडों को कॉपी और पेस्ट करें। हेडर के नीचे और हेडर के नीचे जैसा कि नीचे दिखाया गया है (gedit)।

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

स्क्रिप्ट को निष्पादन योग्य बनाएं (टर्मिनल):

chmod +x patch_file.sh

स्क्रिप्ट चलाएँ (टर्मिनल):

./patch_file.sh # may require sudo access depending on the directory affected

मध्यम से भारी या जटिल संशोधन के लिए +1 पैच हमेशा सीधा तरीका है। मुझे नहीं पता कि क्यों कुछ लोग रेगेक्स टूल का उपयोग करके हर काम करने की कोशिश करते हैं।
user.dz

+1 रिवर्स इंजीनियरिंग से इतना बेहतर है कि आप जिस फ़ाइल के साथ परीक्षण करना चाहते हैं, उस बदलाव को लागू करने के लिए लगता है ... लेकिन जब उस फ़ाइल के अन्य उदाहरणों पर लागू किया जाता है तो कभी-कभी अन्य प्रभाव होते हैं।
बिगजॉश

अगर मैं विशिष्ट टेक्स्ट स्ट्रिंग्स के सभी उदाहरणों को बदलना चाहता हूं, तो पैच का कोई मतलब नहीं है, "सभी" को "_" के साथ बदलें, सभी "माइनस" को "-", और सभी "gb | <string_of_numbers> | ARO" के साथ "" एआरओ: " धन्यवाद।
जोश

1

यदि आप किसी फ़ाइल को संपादित करना चाहते हैं, तो फ़ाइल संपादक का उपयोग करें, कमांड आधारित फ़ाइल संपादक हैं जो स्क्रिप्ट से उपयोग किए जा सकते हैं, जैसे पूर्व या एड


1

आप sed या awk की तलाश में हैं। मुझे लगता है कि sed सरल होना और जागना अधिक शक्तिशाली होना।

यहाँ एक उदाहरण एक और प्रश्न से है

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

इसका मतलब है की:

  • फ़ाइल में खोजें /usr/share/applications/defaults.list
  • खोजें / ग्रेप gedit.desktop
  • से बदलो yournew.desktop
  • जगह में परिवर्तन लागू करें -i

0

आपके द्वारा संपादित किए जाने की आवश्यकता के आधार पर, यदि आप परिचित हैं viतो edउपयोगी हो सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.