मैं डिफ़ॉल्ट PS1 को बदलने के लिए sed को root के रूप में उपयोग करने का प्रयास कर रहा हूं।

पहली 2 लाइनें सिर्फ यह सुनिश्चित करने के लिए थीं कि मेरे पास सिंटैक्स संरचित सही है और यह देखने के लिए कि क्या उद्धरण चिह्नों से कोई फर्क पड़ता है, उन्हें लगातार चलाने से मुझे फ़ाइल के शीर्ष के पास एक टिप्पणी बदलने और फिर इसे वापस बदलने की अनुमति मिलती है। फ़ाइल को नैनो में खोलना पुष्टि करता है कि परिवर्तन प्रभावी हैं, जिसे 'लिखने की अनुमति' से इंकार करना चाहिए।

sed -i 's/If not running interactively,/stringtoreplaceitwith/' /etc/skel/.bashrc
sed -i "s/stringtoreplaceitwith/If not running interactively,/" /etc/skel/.bashrc
sed -i "s/\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ /Replace PS1/" /etc/skel/.bashrc

मुझे यकीन नहीं है कि यह स्ट्रिंग की संरचना के बारे में कुछ और है, लेकिन किसी कारण से, यह वह नहीं ढूंढ रहा है जिसे मैं प्रतिस्थापित करना चाहता हूं।

\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ 

(एक अनुगामी रिक्त के साथ)।

sedPS1

0
TurtleWolf 5 अप्रैल 2019, 20:25

1 उत्तर

सबसे बढ़िया उत्तर

आपकी समस्या उद्धरण और भागने के कारण है। आइए उस स्ट्रिंग को कम करें जिसे आप इसे प्रतिस्थापित करने का प्रयास कर रहे हैं:

\w\[\033[00m\]\$

(एक अनुगामी रिक्त के साथ) - इसमें सभी कठिनाइयाँ हैं, लेकिन कम क्रिया है।

इसका मिलान करने के लिए, हमें करना होगा

  • सभी बैकस्लैश से बचें: \w \\w आदि बन जाता है।
  • बच [ और ], क्योंकि वे sed के लिए विशेष हैं: [ \[ बन जाता है, और \[ \\\[ बन जाता है (बैकस्लैश से बच निकला, बच निकला) [)
  • बच $: \$ बन जाता है \\\$

फिर, हमें अपने sed कमांड के आसपास सिंगल कोट्स का उपयोग करना होगा ताकि शेल स्ट्रिंग को संशोधित न करे:

$ sed 's/\\w\\\[\\033\[00m\\\]\\\$ /Replace PS1/' <<< '\w\[\033[00m\]\$ '
Replace PS1

यह दोहरे उद्धरण चिह्नों के साथ भी काम कर सकता है, लेकिन फिर हमें शेल के लिए एक और एस्केपिंग राउंड जोड़ना होगा: \[ \\\[ बन जाता है (sed के लिए बच गया) बन जाता है \\\\\\[ (खोल के लिए बच निकला), और इसी तरह।

$ sed "s/\\\\w\\\\\\[\\\\033\\[00m\\\\\\]\\\\\\$ /Replace PS1/" <<< '\w\[\033[00m\]\$ '
Replace PS1

डबल उद्धरण केवल तभी समझ में आता है जब आप चर का उपयोग कर रहे हों, हालांकि, स्पष्ट कारणों से।

अंत में, आपकी वास्तविक स्ट्रिंग के लिए:

$ echo '\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' \
    | sed 's/\\\[\\033\[01;32m\\\]\\u@\\h\\\[\\033\[00m\\\]:\\\[\\033\[01;34m\\\]\\w\\\[\\033\[00m\\\]\\\$ /Replace PS1/'
Replace PS1
1
Benjamin W. 5 अप्रैल 2019, 18:15