2009-03-16 17 views
46

स्पष्टीकरण के लिए, मैं वैश्विक खोज करने और पिछली कमांड पर प्रतिस्थापित करने के लिए एक तरीका ढूंढ रहा हूं। ^word^replacement^ केवल पहले मैच को प्रतिस्थापित करने लगता है।^बैश में सभी मैचों पर शब्द^प्रतिस्थापन ^?

क्या कुछ set विकल्प है जो मुझे ढूंढ रहा है?

उत्तर

63

इस प्रयास करें:

$ echo oneone 
oneone 
$ !!:gs/one/two/ # Repeats last command; substitutes 'one' --> 'two'. 
twotwo 
+0

यह मेरे लिए काम नहीं करता है। मुझे 'दोोन' – finnw

+0

मिल गया है क्या आप वाकई इसे सही टाइप करते हैं? यह मेरे लिए ठीक काम करता है। (मैं जीएनयू बैश का उपयोग कर रहा हूं, संस्करण 3.2.48 (1) - कृपया।) –

+1

बस बैश के पुराने संस्करण पर परीक्षण किया गया है, और (असुरक्षित) यह काम नहीं करता है: '$ $ BASH_VERSION' _ (2.05 .8 (1) - कृपया) _ '$ echo eone' _ (आउट: एकोन) _ ' $ !!: जीएस/एक/दो' _ (आउट: दोोन) _ ... '$ echo $ BASH_VERSION' _ (आउट: 3.2.25 (1) -release) _ '$ echo eone' _ (आउट: एकोन) _ ' $ !!: जीएस/एक/दो' _ (आउट: twotwo) _ ... सभी चीजों के लिए सामान्य सलाह bash? संस्करण 3+ – michael

1

एक बुरा तरीका यह चारों ओर पाने के लिए कुछ इस तरह हो सकता है:

के लिए गमागमन एल के द्वारा BAABAA बजाय BLABLA गूंज करना चाहते हैं एक के

$ echo "BLABLA" 
BLABLA 
$ `echo "!!" | sed 's/L/A/g'` 
$(echo "echo "BLABLA" " | sed 's/L/A/g') 
BAABAA 
$ 

दुर्भाग्य से इस तकनीक में काम करने के लिए प्रतीत नहीं होता कार्य या उपनाम।

+0

अधिकार:

यहाँ "myfile.txt" नाम की एक फ़ाइल में एक स्ट्रिंग को बदलने के लिए विश्व स्तर पर बताया गया है। इसके अतिरिक्त, यह एक महंगा कांटा उत्पन्न करता है। हजारों पुनरावृत्तियों से जुड़े एक ऑपरेशन में, यह एक महत्वपूर्ण समय खींचने के लिए तैयार करेगा। – xizdaqrian

5

जॉन Feminella के साथ मेरा उत्तर here सम्मिश्रण आप यह कर सकते हैं यदि आप किसी अन्य नाम हैं:

$alias dothis='`history -p "!?monkey?:gs/jpg/png/"`' 
$ls *.jpg 
monkey.jpg 
$dothis 
monkey.png 

!! केवल पिछले कमांड करता है, जबकि!? स्ट्रिंग? "स्ट्रिंग" युक्त सबसे हालिया कमांड से मेल खाता है।

+0

यह बिल्कुल काम नहीं करता है। बंदर नामक कोई आदेश नहीं था, इसलिए मेरे इतिहास में बंदर –

-1

मैं इसे SUSE 10.1 पर परीक्षण करता हूं। "^ शब्द^प्रतिस्थापन ^" काम नहीं करता है, जबकि "^ शब्द^प्रतिस्थापन" अच्छी तरह से काम करता है। एक उदाहरण के लिए :

$ SENTENCE="1 word, 2 words";echo "${SENTENCE//word/replacement}" 
1 replacement, 2 replacements 

नोट डबल स्लैश के उपयोग को दर्शाता है "वैश्विक" स्ट्रिंग प्रतिस्थापन:

linux-geek:/home/Myworks # ls /etc/ld.so.conf 
/etc/ld.so.conf 
linux-geek:/home/Myworks # ^ls^cat 
cat /etc/ld.so.conf 
/usr/X11R6/lib/Xaw3d 
/usr/X11R6/lib 
/usr/i486-linux-libc5/lib=libc5 
/usr/i386-suse-linux/lib 
/usr/local/lib 
/opt/kde3/lib 
/opt/gnome/lib 
include /etc/ld.so.conf.d/*.conf 
linux-geek:/home/Myworks # 
+0

युक्त कुछ भी नहीं है, लेकिन यह केवल पिछली पंक्ति पर शब्द के * एक * उदाहरण को प्रतिस्थापित करता है (आदेश होता है)। '^^' सबस्टेशन विधि के साथ 'ls/etc/passwd/etc/passwd' को' ls/etc/hosts/etc/hosts' में बदलने का प्रयास करें। –

4

यह समाधान बैश सबस्ट्रिंग रिप्लेसमेंट उपयोग करता है।

यह समाधान एक लाइन में निष्पादित किया जा सकता है।

$ sed -i -e "s/word/replacement/g" myfile.txt 
संबंधित मुद्दे