2013-04-25 7 views
7

में तारों को प्रतिस्थापित करें मैं zsh और emacs keybindings का उपयोग करता हूं। कुछ समय मुझे अलग इनपुट के साथ एक ही कमांड निष्पादित करने की आवश्यकता है। इनपुट में सामान्य रूप से सामान्य सबस्ट्रिंग होते हैं। क्या किसी अन्य स्ट्रिंग के साथ पिछले कमांड के हिस्सों को प्रतिस्थापित करने का कोई आसान तरीका है? उदाहरण के लिए, पिछला आदेश है:zsh कमांड लाइन

cat chr2.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr2.unknow.withpvalue.feature.filtered > chr2.combined.txt 

मैं 'chr2' के साथ 'chr2' को आसानी से कैसे बदल सकता हूं?

सवाल, कैसे अन्य विभिन्न तार करने के लिए आदेश में कई अलग अलग सबस्ट्रिंग को बदलने के लिए करने के लिए एक विस्तार:

cat chr1.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr3.unknow.withpvalue.feature.filtered 

कैसे बदलने के लिए, मान लें कि, 'chr1' 'chrX', 'ChR2' के साथ जाने wtih 'chrY', 'chr3' 'chrZ' के साथ?

धन्यवाद।

उत्तर

17

तुम भी (!!:s^old^new^ की तुलना में बहुत तेजी से) ^old^new साथ तेजी इतिहास प्रतिस्थापन कर सकते हैं

~ % cd /tmp 
/tmp % ^tmp^etc # <-- changes tmp for etc 
/tmp % cd /etc 
/etc % 

यह केवल पहली घटना बदल जाता है। यदि आपको और अधिक चाहिए, तो इतिहास संशोधक का उपयोग करें। उदाहरण: वैश्विक परिवर्तन:

/etc % echo tmp tmp tmp 
tmp tmp tmp 
/etc % ^tmp^etc 
/etc % echo etc tmp tmp # <--- only the first tmp got changed 
etc tmp tmp 
/etc % ^tmp^etc^:G  # <-- 'global' 

पुनश्च: ^foo^bar के लिए खोज zshexpn पुस्तिका अनुभाग इस का वर्णन खोजने के लिए। थोड़ा नीचे (मैन्युअल में) स्क्रॉल करें, और आप 'इतिहास विस्तार संशोधक' सूची देखेंगे।

पुनश्च: कई प्रतिस्थापन के लिए, कार्य करें: ^old1^new1^:s^old2^new2^ आदि

6

पूरा करने के लिए आप सीधे के लिए क्या पूछा:

$ !!:s/chr1/chrX/:s/chr2/chrY/:s/chr3/chrZ/ 

यह पिछले आदेश में प्रवेश किया संशोधित करेगा। वैश्विक प्रतिस्थापन करने के लिए, :gs/a/b/ का उपयोग करें।

उदाहरण:

$ man zshall 
$ !!:gs/man/less/:gs/zshall/.history/<TAB> 
$ less .history 

पढ़ें man zshexpn में और अधिक - ZSH विस्तार और प्रतिस्थापन।

+0

अपने जवाब के लिए धन्यवाद। चूंकि फ्रांसिस्को दो तरीकों से प्रदान करता है, इसलिए मैंने उसे स्वीकार कर लिया और अपना अपवित्र किया। – Rainfield

+0

अच्छी तरह से आपने एक साथ कई प्रतिस्थापन के लिए पूछा, AFAIU '^ पुराना^नया^'केवल एक प्रतिस्थापन के लिए अनुमति देता है। –

+1

ध्यान दें कि '^ पुराना^नया ^' सिर्फ '!!: s^foo^bar^'का समानार्थी है। इसलिए यदि आप कई प्रतिस्थापन करना चाहते हैं, तो आप आगे बढ़ने की तरह आगे बढ़ सकते हैं। मैं अपना जवाब अपडेट करूंगा ... – Francisco