Sed क्या है और इसका उपयोग किस लिए किया जाता है?


20

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

वास्तव में क्या है sedऔर इसके उपयोग क्या हैं? मैं एक व्यापक उत्तर की तलाश कर रहा हूं कि क्या sedहै, आमतौर पर इसका क्या उपयोग किया जाता है, और कुछ बुनियादी उदाहरण / वाक्यविन्यास।


3
सेड मैन पेज से:Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.
saji89

व्यापक उत्तर शुरू करने के लिए यह एक अच्छी जगह होनी चाहिए: en.wikipedia.org/wiki/Sed
saji89

1
info sedसे बहुत अधिक है man sed। फिर, में /usr/share/doc/sed, वहाँ है sedfaq.txt.gz

जवाबों:


20

बुनियादी उपयोग में इसका उपयोग स्ट्रिंग्स के साथ 'खोज और प्रतिस्थापित' के लिए किया जाता है।

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

रिटर्न

"The quick brown fox jumps over the lazy cat"

सैड वास्तव में चमकता है जब इसके साथ नियमित अभिव्यक्ति का उपयोग किया जाता है।

आप इस लेख के बारे में एक नज़र डाल सकते हैं sed, इसके बारे में काफी व्यापक है।


5

परिभाषाएं

यूनिक्स सिस्टम V: एक व्यावहारिक गाइड , मार्क सोबेल की पुस्तक:

सेड यूटिलिटी एक बैच (नॉनएन्डेक्टिव) एडिटर है। आमतौर पर sed कमांड एक स्क्रिप्ट-फाइल में संग्रहित होती है। । .al हालांकि आप कमांड लाइन से सरल सेड कमांड दे सकते हैं। । ।

मैन पेज फॉर सेड (GNU sed) 4.2.2:

सैड एक स्ट्रीम एडिटर हैं। एक धारा संपादक का उपयोग इनपुट स्ट्रीम (एक पाइपलाइन से एक फ़ाइल या इनपुट) पर मूल पाठ परिवर्तनों को बनाने के लिए किया जाता है।

मेरी अनौपचारिक परिभाषा:

Sed( स्ट्रीम एडिटर के लिए संक्षिप्त ) एक टेक्स्ट-प्रोसेसिंग यूटिलिटी है जिसे उस समय विकसित किया गया है जब टेक्स्ट को एक बार में एक पंक्ति में संसाधित किया गया था, लेकिन सबसे शक्तिशाली यूनिक्स / लिनक्स उपयोगिताओं में से एक बना हुआ है; एक ही समय में, यह स्क्रिप्टिंग भाषा का एक रूप है, जिसे विशेष रूप से प्रसंस्करण पाठ के लिए डिज़ाइन किया गया है।

उपयोग

जैसा कि परिभाषाएँ सुझाती हैं, sedका उपयोग पाठ की टेक्स्ट प्रोसेसिंग लाइनों, पाठ फ़ाइलों और पाठ की पाइप स्ट्रीम के लिए किया जाता है। सबसे अधिक बार इसका उपयोग पाठ को हटाने के साथ-साथ प्रतिस्थापित करने के लिए भी किया जाता है:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

हालाँकि, इसका उपयोग अन्य आदेशों के व्यवहार की नकल करने के लिए भी किया जा सकता है। उदाहरण के लिए,

  • नक़ल करना dmesg | head -n 3(पहले 3 पंक्तियों को छापना), हम कर सकते हैं dmesg | sed -n 1,3p
  • नकल करने dmesg | grep 'wlan0'के लिए (एक स्ट्रिंग की खोज), हम कर सकते हैंdmesg | sed -n '/wlan0/p'
  • सामग्री सूचीबद्ध करें

sedअन्य टेक्स्ट-प्रोसेसिंग यूटिलिटीज पर जो बड़ा फायदा है वह -iझंडा है, जिसका अर्थ है कि हम केवल संपादित टेक्स्ट को स्क्रीन पर आउटपुट नहीं कर सकते हैं, लेकिन वास्तव में एडिट को मूल फ़ाइल में सहेज सकते हैं। awkइसके विपरीत, जायके, केवल GNU awkसंस्करण में ऐसी सुविधा है ।

sedकमांड लाइन पर इनपुट ले सकते हैं, सेमीकॉलन ( ;) या -fध्वज के बाद निर्दिष्ट स्क्रिप्ट फ़ाइल से अलग कई पैटर्न के साथ , जैसेcat someTextfile.txt | sed -f myScript.sed

सैड एप्लिकेशन और उदाहरण


1

sed एक शक्तिशाली कमांड है जो आपको चीजें बनाने में सक्षम बनाता है (लाइनों को हटा दें, स्ट्रिंग प्रतिस्थापन, स्ट्रिंग फ़िल्टरिंग, आदि)।

मैं आपको आर्ग के साथ उपयोगों की एक सूची दे सकता हूं लेकिन इंटरनेट उसी से भरा है। खोज sed usage by examplesमुझे बहुत सारे परिणाम लाती है, एक प्यारा: http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substeration-examples/


1

यह उत्तर कार्य प्रगति पर है - यह susbstitute कमांड के बारे में अधिक उदाहरणों को याद करता है


क्या है sed?

sed = स्ट्रीम एडिटर

GNU sed4.2.2 रिपोर्ट के मैनुअल पेज में विवरण :

सैड एक स्ट्रीम एडिटर हैं। एक धारा संपादक एक इनपुट स्ट्रीम (एक पाइपलाइन से एक फ़ाइल या इनपुट) पर मूल पाठ परिवर्तनों को करने के लिए उपयोग किया जाता है। जबकि कुछ मायनों में एक संपादक के समान जो स्क्रिप्टेड एडिट्स (जैसे एड) की अनुमति देता है, सेड इनपुट (एस) पर केवल एक पास बनाकर काम करता है, और फलस्वरूप अधिक कुशल होता है। लेकिन यह एक पाइपलाइन में पाठ को छानने की सीड की क्षमता है जो विशेष रूप से इसे अन्य प्रकार के संपादकों से अलग करती है।

में decription जीएनयू sedgnu.org पर पेज की रिपोर्ट:

sed (स्ट्रीम एडिटर) एक इंटरैक्टिव टेक्स्ट एडिटर नहीं है। इसके बजाय, इसका उपयोग पाठ को फ़िल्टर करने के लिए किया जाता है, अर्थात, यह पाठ इनपुट लेता है, उस पर कुछ ऑपरेशन (या संचालन का सेट) करता है, और संशोधित पाठ को आउटपुट करता है। आमतौर पर फ़ाइल के एक भाग को निकालने के लिए sed का उपयोग पैटर्न मिलान या फ़ाइल के भीतर स्ट्रिंग की कई घटनाओं को प्रतिस्थापित करने के लिए किया जाता है।

किसके लिए sedप्रयोग किया जाता है?

इसका उपयोग डेटा की धाराओं (आमतौर पर पाठ, लेकिन बाइनरी डेटा को संशोधित करने के लिए भी किया जा सकता है) के लिए जटिल संशोधनों को करने के लिए किया जा सकता है।

उपयोग के सबसे सामान्य मामलों में से हैं:

  • मूल / विस्तारित नियमित अभिव्यक्तियों का उपयोग करके पाठ फ़ाइल से लाइनों को मुद्रण / हटाने के लिए
  • वैश्विक रूप से मूल / विस्तारित नियमित अभिव्यक्तियों का उपयोग करके एक पाठ फ़ाइल में स्ट्रिंग की जगह
  • मूल / विस्तारित नियमित अभिव्यक्तियों का उपयोग करके पाठ फ़ाइल में स्ट्रिंग की जगह लेना

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

प्रयोग

sedफाइलसिस्टम में संग्रहीत फ़ाइल से इनपुट को पढ़ता है यदि एक फ़ाइल नाम उसके आह्वान के दौरान कमांड-लाइन तर्कों में निर्दिष्ट किया गया है, या stdinयदि कोई फ़ाइल नाम निर्दिष्ट नहीं है।

फ़ाइल सिस्टम में संग्रहीत फ़ाइल का उपयोग करके न्यूनतम आमंत्रण:

sed '' file

उपयोग कर न्यूनतम आमंत्रण stdin:

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

नमस्ते दुनिया!

sedडिफ़ॉल्ट रूप से इनपुट फ़ाइल लाइन-बाय-लाइन पढ़ता है; यह एक पंक्ति पढ़ता है, यह लाइन की अनुगामी न्यूलाइन को हटा देता है और प्रोसेस्ड लाइन को "पैटर्न स्पेस" में डाल देता है; अंत में, यह पैटर्न स्पेस की वर्तमान सामग्री पर सूचीबद्ध कमांड को निष्पादित करता है और इनपुट फ़ाइल से एक नई लाइन पढ़ता है।

जब कोई कमांड निर्दिष्ट नहीं होती है या जब pया एक dकमांड निर्दिष्ट किया जाता है *, sedतो हमेशा प्रत्येक पुनरावृत्ति पर एक नई लाइन के बाद पैटर्न स्पेस की वर्तमान सामग्री को प्रिंट करेगा चाहे:

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

इसे रोकने के लिए एक स्विच sedके साथ आह्वान किया जा सकता है -n:

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

* के लिए ही बात हो रही है p, dऔर sआदेश, जो इस जवाब में शामिल आदेशों हैं।

लाइनों का चयन

sedपूरे इनपुट फ़ाइल को प्रोसेस कर सकते हैं या इनपुट फ़ाइल के केवल चयनित लाइनों को प्रोसेस कर सकते हैं; संसाधित की जाने वाली इनपुट फ़ाइल की पंक्तियों का चयन "पते" को निर्दिष्ट करके किया जाता है; एक पता (अन्य बातों के अलावा) एक पंक्ति संख्या या एक पैटर्न हो सकता है; पतों की श्रेणियों को पतों की श्रेणी निर्दिष्ट करके चुना जा सकता है।

पतों के संभावित संयोजन हैं:

  • <N>(जहां <N>एक संख्या है): निम्नलिखित कमांड / कमांड केवल लाइन नंबर पर निष्पादित किए जाएंगे <N>;
  • <N>,<M>(जहाँ <N>और <M>दो संख्याएँ हैं, <N>> <M>): निम्न आदेश / आदेशों को लाइन संख्या <N>से लाइन संख्या <M>समावेशी तक की रेखाओं पर निष्पादित किया जाएगा ;
  • /<pattern>/(जहां <pattern>एक बुनियादी या विस्तारित नियमित अभिव्यक्ति है): निम्नलिखित आदेश / आदेशों को केवल एक घटना युक्त लाइनों पर निष्पादित किया जाएगा <pattern>;
  • /<pattern1>/,/<pattern2>/(जहां <pattern1>और <pattern2>मूल या विस्तारित नियमित अभिव्यक्ति हैं): निम्नलिखित आदेश / आदेशों को पहली पंक्ति से लेकर <pattern1>अगली पंक्ति की घटना वाली एक घटना से युक्त रेखाओं पर निष्पादित किया जाएगा <pattern2>, जिसमें कई बार आदेश दिए गए <pattern1>- कई आदेशों के मामले में <pattern2>;
  • <N>,/pattern/(जहां <N>एक संख्या है और <pattern>एक मूल या विस्तारित नियमित अभिव्यक्ति है): निम्नलिखित कमांड / कमांड को लाइन नंबर <N>से पहली पंक्ति तक की रेखाओं पर निष्पादित किया जाएगा, जिसमें एक घटना होती है <pattern>;
  • /pattern/,<N>(जहां <pattern>एक मूल या विस्तारित नियमित अभिव्यक्ति है और <N>एक संख्या है): निम्नलिखित कमांड / कमांड को पहली पंक्ति से लेकर <pattern>लाइन नंबर की घटना से युक्त लाइनों पर निष्पादित किया जाएगा <N>;

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

जब लाइनों की प्रिंटिंग रेंज या केवल उन लाइनों को प्रिंट करना जिस पर एक प्रतिस्थापन का प्रदर्शन किया गया है, तो मानदंड से मेल खाने वाली लाइनों को दो बार मुद्रित करने से रोकने के sedलिए -nस्विच के साथ-साथ आह्वान करना आवश्यक है (यह केवल तब होता है जब लाइनों की छपाई रेंज होती है) और क्रम में मानदंड मुद्रित करने के लिए लाइनों की परवाह किए बिना मुद्रित होने से रोकने के लिए।

संसाधित की जाने वाली लाइनों का चयन एक कमांड द्वारा या कई अर्धविराम से अलग-अलग कमांडों को ब्रेसिज़ का उपयोग करके किया जाना चाहिए।

कमांड्स: प्रिंट करें, हटाएं

एक चयन को मुद्रित करने या हटाने के लिए उपयोग की जाने वाली कमांड क्रमशः हैं:

  • p: निर्दिष्ट पते / पते की सीमा से मेल खाती लाइनें;
  • d: निर्दिष्ट पते / पते की श्रेणी से मेल खाती लाइनें हटाता है;

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

उदाहरण: प्रिंट करना, हटाना

संख्यात्मक पते निर्दिष्ट करने वाली लाइनें मुद्रण / हटाना:

नमूना फ़ाइल:

line1
line2
line3
line4
line5
  • मुद्रण लाइन <N>:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • हटाने की रेखा <N>:
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • समावेशी के <N>लिए मुद्रण लाइन <M>:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • समावेशी के <N>लिए लाइन हटाना <M>:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

पैटर्न निर्दिष्ट करने वाली लाइनें मुद्रण / हटाना:

नमूना फ़ाइल:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • मुद्रण लाइनों का मिलान <pattern>:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • मिलान रेखाएँ हटाना <pattern>:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • समावेशी <pattern1>रेखा से मेल खाती रेखा से मुद्रण रेखाएँ <pattern2>:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • समावेशी <pattern1>रेखा से मेल खाती रेखा से रेखाओं को हटाना <pattern2>:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

आज्ञा: स्थानापन्न

चयन पर प्रतिस्थापन का कार्य करने के लिए कमांड का उपयोग किया जाता है:

  • s: निर्दिष्ट पते / पते की सीमा से मेल खाती लाइनें;

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

sकमांड का सिंटैक्स है:

s/<pattern>/<replacement_string>/<pattern_flags>

स्लैश "सीमांकक" हैं; वे परिसीमित करने के लिए उपयोग किया जाता है <pattern>, <replacement_string>और <pattern_flags>वर्गों;

sकमांड के तुरंत बाद सीमांकक हमेशा चरित्र होता है ; इसे किसी अन्य वर्ण पर सेट किया जा सकता है, उदाहरण के लिए |:

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern>एक मूल या विस्तारित नियमित अभिव्यक्ति है; <replacement_string>एक निश्चित स्ट्रिंग है जिसमें sedएक विशेष अर्थ के साथ विशिष्ट अनुक्रम शामिल हो सकते हैं ; <pattern_flags>झंडे की एक सूची है जो के व्यवहार को संशोधित करती है <pattern>

sedएक विशेष अर्थ के साथ सबसे आम- विशिष्ट अनुक्रम:

  • &: बैकरेंस को मिलान किए गए स्ट्रिंग के साथ बदल दिया गया <pattern>;
  • \<N>(जहां <N>एक संख्या है): बैकरेफरेंस को उस पर <N>कब्जा किए गए समूह के साथ बदल दिया गया <pattern>;

सबसे आम झंडे:

  • g: <pattern>विश्व स्तर पर, यानी प्रत्येक पंक्ति में कई बार मैच करने के लिए मजबूर करता है;
  • i: <pattern>केस-असंवेदनशीलता से मेल खाने के लिए मजबूर करता है;
  • p: उन लाइनों को प्रिंट करता है जिन पर एक प्रतिस्थापन को एक बार फिर से प्रदर्शित किया जाता है (उपयोगी है जब -nस्विच का उपयोग sedकेवल उन लाइनों को प्रिंट करने के लिए जिस पर एक प्रतिस्थापन किया गया है);

उदाहरण: स्थानापन्न

नमूना फ़ाइल:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, the bird is the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the word!
A-well-a bird, bird, b-bird's the word
A-well-a...
  • प्रत्येक पंक्ति के <pattern>साथ पहली घटना को प्रतिस्थापित करना <replacement_string>:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, the bird is the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, bird, b-bird's the word
  • के सभी आवृत्तियां की जगह <pattern>के साथ <replacement_string>प्रत्येक पंक्ति पर:
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, birds, b-birds's the word
A-well-a...
  • केवल लाइनों के साथ शुरू का चयन <pattern1>और के सभी आवृत्तियां की जगह <pattern2>के साथ <replacement_string>:
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the word
  • केवल लाइनों के साथ समाप्त होने का चयन <pattern1>और के सभी आवृत्तियां की जगह <pattern2>के साथ <replacement_string>:
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, b-birds's the word
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.