जब इनपुट फ़ाइल तलाशने योग्य होती है (जैसे नियमित फ़ाइल से पढ़ना) या अन-सीकेबल (जैसे पाइप से पढ़ना), sed
(और अन्य मानक उपयोगिताओं) अलग तरीके से व्यवहार करेंगे ( इस लिंकINPUT FILES
में अनुभाग पढ़ें )।
डॉक्टर से उद्धरण:
जब एक मानक उपयोगिता एक शोध योग्य इनपुट फ़ाइल पढ़ती है और एक त्रुटि के बिना समाप्त हो जाती है, तो यह फ़ाइल के अंत तक पहुंचने से पहले, उपयोगिता सुनिश्चित करेगी कि खुले फ़ाइल विवरण में फ़ाइल ऑफ़सेट उपयोगिता द्वारा संसाधित अंतिम बाइट से ठीक पहले स्थित है।
तो में:
(sed '/y/ q'; echo aaa; cat) < test
sed
q
EOF तक पहुँचने से पहले uit कमांड का प्रदर्शन किया , इसलिए इसने zzz
लाइन की शुरुआत में फाइल ऑफ़सेट को छोड़ दिया है, इसलिए बाक़ी cat
लाइनों को प्रिंट करना जारी रख सकते हैं (GNU सेड कुछ स्थिति में POSIX अनुरूप नहीं है, नीचे देखें)।
और डॉक्टर से जारी:
ऐसी फ़ाइलों के लिए जो खोज योग्य नहीं हैं, फ़ाइल की स्थिति उस फ़ाइल के लिए खुले फ़ाइल विवरण में ऑफसेट होती है जो अनिर्दिष्ट है
इस स्थिति में, व्यवहार अनिर्दिष्ट है। अधिकांश मानक उपकरण, शामिल sed
इनपुट का यथासंभव उपभोग करेंगे। यह फ़ाइल ऑफ़सेट को पढ़ने के बिना yyy
लाइन को पास करता है , और q
यूट को पढ़ता है , इसलिए इसके लिए कुछ भी नहीं बचा है cat
।
GNU sed
मानक के अनुरूप नहीं है, सिस्टम के stdio कार्यान्वयन और glibc संस्करण पर निर्भर करता है:
$ (gsed '/y/ q'; echo aaa; cat) < test
xxx
yyy
aaa
यहां, परिणाम मैक ओएसएक्स 10.11.6, वर्चुअल मशीन सेंटोस 7.2 - ग्लिबक 2.17, उबंटू 14.04 - ग्लिब 2. 2.19 से मिला, जो सीईपीएच बैकएंड के साथ ओपनस्टैक पर चलते हैं।
उन प्रणालियों पर, आप -u
मानक व्यवहार को प्राप्त करने के लिए विकल्प का उपयोग कर सकते हैं :
(gsed -u '/y/ q'; echo aaa; cat) </tmp/test
और पाइप के लिए:
$ cat test | (gsed -u '/y/ q'; echo aaa; cat)
xxx
yyy
aaa
zzz
जो बहुत ही अक्षम प्रदर्शन करता है, क्योंकि sed
एक बार में एक बाइट को पढ़ना पड़ता है। इससे आंशिक उत्पादन strace
:
$ strace -fe read sh -c '{ sed -u "/y/q"; echo aaa; cat; } <test'
...
[pid 5248] read(3, "", 4096) = 0
[pid 5248] read(0, "x", 1) = 1
[pid 5248] read(0, "x", 1) = 1
[pid 5248] read(0, "x", 1) = 1
[pid 5248] read(0, "\n", 1) = 1
xxx
[pid 5248] read(0, "y", 1) = 1
[pid 5248] read(0, "y", 1) = 1
[pid 5248] read(0, "y", 1) = 1
[pid 5248] read(0, "\n", 1) = 1
yyy
...
cat
(सब शेल में) पहले मामले में फ़ाइल डिस्क्रिप्टर का फिर से उपयोग कर सकता है, क्योंकि स्टड एक वास्तविक फ़ाइल से जुड़ा हुआ है। दूसरे मामले में, स्टडिन एक पाइप से है और एक वास्तविक फ़ाइल नहीं है। ध्यान दें कि(sed '/y/ q'; echo aaa; cat) < <(cat test)
प्रिंट भी नहींzzz
।