कमांड लाइन से मानक आउटपुट तक पूरे बफर को कैसे लिखें?


10

मैं /dev/stdoutफ़ाइल के बजाय पूरे बफर को मानक आउटपुट ( ) में लिखना चाहता हूं और निम्न कमांड फ़ाइल को संपादित करते समय अपेक्षित रूप से काम करता है:

:w >> /dev/stdout

संकेत: स्क्रीन को ताज़ा करने के लिए Control+ दबाएँ L

लेकिन यह अपेक्षित नहीं है जब मैं कमांड लाइन ( गैर-अंतःक्रियात्मक ) से ऐसा करने की कोशिश कर रहा हूं , उदाहरण में:

$ echo This is example. | vim - '+:w >> /dev/stdout' '+:q!'
Vim: Reading from stdin...

साथ ही :w !tee, :x! /dev/stdout, :%printऔर इसी तरह की।

छोड़ने से पहले, यह कह रहा है [Device] 1L, 17C appended:।

क्या पाइप के बीच में मानक आउटपुट में मानक इनपुट लिखने के लिए विम को मजबूर करने का कोई तरीका है? शायद यह किसी तरह बफर्ड है?


4
बस जिज्ञासु, आप क्या हासिल करने की कोशिश कर रहे हैं? के रूप में, यहाँ आप के लिए क्या करेंगे कि कुछ अन्य उपकरण नहीं हो सकता है?
जे। थॉम्पसन

1
@JayThompson मैं vimफ़ाइल पार्सिंग के लिए उपयोग करने का प्रयास कर रहा हूं sed(उदाहरण के लिए कई बड़ी फ़ाइलों में बड़े पैमाने पर जटिल परिवर्तन)। उदाहरण यह सरल रखने के लिए और किसी अन्य पोस्ट की संभावित डुप्लिकेट नहीं बनाने के लिए कुछ भी नहीं करता है ।
kenorb

आप वाइप के बारे में जानते हैं, इसलिए किसी भी कारण से आप इसका उपयोग नहीं कर रहे हैं?
मूरू

@ muru मैंने अभी तक इसका उपयोग नहीं किया है, बहुत अधिक दस्तावेज उपलब्ध नहीं हैं और यह यहाँ ऑफ टॉपिक है।
kenorb

वाइप के बारे में प्रश्न हो सकते हैं, लेकिन इसका कोई कारण नहीं है कि यह उत्तर नहीं हो सकता है। इसलिए मैं सोच रहा हूं कि मैं इसे उत्तर के रूप में क्यों नहीं पोस्ट करूं।
मुरु

जवाबों:


9

शेल को मानक उत्पादन में बफर प्रिंट vimकरने के लिए, एक्स मोड में शुरू करने की आवश्यकता होती है, अन्यथा यह अपनी खिड़की से "सामान्य" रास्ता खोल देगा और किसी भी आउटपुट बफ़र्स को छोड़ देगा।

यहाँ सबसे सरल काम उदाहरण है:

$ echo foo | vim -e '+%print' '+q!' /dev/stdin
foo

या इससे भी कम:

$ echo foo | ex +%p -cq! /dev/stdin
$ echo foo | ex +"%p|q!" /dev/stdin

नोट: कमांड vim -eमूल रूप से exकमांड के बराबर है ।

/dev/stdinअतिरिक्त कष्टप्रद संदेशों (जैसा कि नीचे बताया गया है) को रोकने के लिए मानक इनपुट के लिए विशेष फ़ाइल डिस्क्रिप्टर को निर्दिष्ट ( ) करने की आवश्यकता है ।


और यहाँ कुछ उदाहरण हैं जो तार के साथ हैं:

$ echo This is example. | vim -e '+s/example/test/g' '+%print' '+q!' /dev/stdin
This is test.
$ echo This is example. | vim - -es '+s/example/test/g' '+%print' '+q!'
Vim: Reading from stdin...
This is test.

नोट: अंतिम उदाहरण अतिरिक्त कष्टप्रद संदेश दिखाता है जो इसे छिपाना संभव नहीं है, यह इसलिए है क्योंकि पूरी फ़ाइल को मेमोरी में पढ़ने और यह कहने की मानक रणनीति है कि इसे मानक इनपुट से पढ़ा गया था। पहला उदाहरण संदेश के बिना काम करता है, क्योंकि फ़ाइल एक अंतहीन फ़ाइल ( ईओएफ ) सिग्नल के बिना अंतहीन डेटा का उत्पादन करती है , इसलिए यह अपने इनपुट रीडिंग के अंत तक कभी नहीं पहुंचेगा।


सम्बंधित:


1
आप इसके +q!बजाय सिर्फ +:q!सही कर सकते हैं ?
एंड्रयू

@AndrewMacFie यह वही बात है, अद्यतन, धन्यवाद।
केनोरब

3

vipeसंपादन पाइपलाइनों के लिए एक सुविधाजनक उपकरण है, moreutilsपैकेज का हिस्सा है । यह संपादकों के लिए एक आवरण है (जिसमें viयह अपना नाम देता है)। यह का उपयोग करता है EDITORअन्य उपकरण है कि का उपयोग करने के साथ की तरह संपादक स्थापित करने के लिए है, इसलिए, वातावरण चर EDITOR(जैसे crontab, visudo, आदि), आप कर सकते हैं स्क्रिप्ट है कि चर का उपयोग कर कार्रवाई। उदाहरण के लिए, आप इसे करने के लिए इसे बदल सकते हैं:

$ echo foo | EDITOR='vim +:s/foo/bar/ +wq' vipe | tail
bar

बेशक, जटिल क्रियाएं नरक को उद्धृत करने के लिए विकसित हो सकती हैं, इसलिए आप एक स्क्रिप्ट लिख सकते हैं:

#! /bin/sh

vim "+:s/foo/bar" '+wq' "$@"

और उपयोग करें EDITOR="sh /path/to/script"

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