2009-11-03 9 views
62

कुछ अभिव्यक्तियों के अनुसार मैं sed फ़िल्टर मिलान रेखा कैसे बना सकता हूं, लेकिन उन्हें प्रिंट करने की बजाय गैर मिलान वाली रेखाओं को अनदेखा कर सकता हूं?क्या गैर-मिलान वाली रेखाओं को अनदेखा करें

कोई वास्तविक उदाहरण के रूप में, मैं फ़ाइलों का एक सेट पर scalac (स्काला संकलक) चलाने के लिए, और उसके -verbose उत्पादन से बनाए गए .class फ़ाइलों को पढ़ने के लिए चाहते हैं। scalac -verbose संदेशों का एक समूह आउटपुट करता है, लेकिन हम केवल [wrote some-class-name.class] के रूप में रुचि रखते हैं। क्या मैं वर्तमान में कर रहा हूँ है यह (|& पाइप stderr करने के लिए बैश 4.0 के रास्ते अगले कार्यक्रम के लिए है):

$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/' 

यह संदेशों हम में रुचि रखते हैं से फ़ाइल नाम निकालने होगा, लेकिन होगा अन्य सभी संदेशों को अपरिवर्तित के माध्यम से भी जाने दें! बेशक हम बजाय ऐसा कर सकता है:

$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' | 
    sed 's/^\[wrote \(.*\.class\)\]$/\1/' 

जो काम करता है लेकिन बहुत ज्यादा वास्तविक समस्या है, जो sed निर्देश देने के लिए कैसे इनपुट से मेल नहीं खाने वाले लाइनों की अनदेखी करने के लिए है चारों ओर जा रहा तरह दिखता है। तो हम इसे कैसे करते हैं?

उत्तर

65

एक और तरीका है:

sed -e 's/.../.../;t;d' 

s///, एक substituion, t किसी भी लेबल सशर्त सभी आदेशों का पालन छोड़ देता है तो बिना है d लाइन हटा देता है।

perl या grep के लिए कोई आवश्यकता नहीं है।

(निकोलस रिले के सुझाव के बाद संपादित)

+3

ओएस एक्स 10.8.2 पर मुझे अर्धविराम की बजाय एक नई लाइन के साथ 'tx' और' d' को अलग करना पड़ा क्योंकि मुझे 'अपरिभाषित लेबल 'x; d;: x'' मिल रहा था। – davidchambers

+4

यहां तक ​​कि बेहतर: 'sed -e's /.../.../ '-e' tx '-e' d '-e': x'' (एक [समान प्रश्न] पर एक टिप्पणी में सुझाया गया है (http : //stackoverflow.com/a/1252191/312785))। – davidchambers

+1

'टी' स्क्रिप्ट के अंत में स्थानांतरित नहीं होगा यदि कोई लेबल प्रदान नहीं किया गया है, तो आसान: 'sed -e' s /.../.../ '-e' t '-e' d''। –

3

उपयोग पर्ल:

... |& perl -ne 'print "$1\n" if /^\[wrote (.*\.class)\]$/' 
164

आप लाइनों कि मेल नहीं खाते मुद्रित करने के लिए नहीं करना चाहते हैं, तो आप मुद्रित करने के लिए जो नहीं sed बताता है की

  • -n विकल्प संयोजन का उपयोग कर सकते हैं
  • p ध्वज जो क्या मुद्रित करने के लिए sed बताता मिलान किया जाता है

इस देता है: sed सादे साथ

sed -n 's/.../.../p' 
+7

यह स्वीकार किए जाते हैं जवाब –

+1

एक इस दृष्टिकोण के लिए नकारात्मक पक्ष यह है कि अगर आप एक से अधिक भाव इससे मिलान नहीं, परिणाम भी कई बार मुद्रित हो जाएगा होना चाहिए। उदाहरण के लिए: 'echo foo | sed -n -e's/foo/bar/p '-e' s/bar/oof/p'' अलग-अलग पंक्तियों पर 'बार' और 'ओओएफ' दोनों आउटपुट करेगा। हालांकि गोटो-लेबल किस्म कई पैटर्न को संभाल नहीं सकता है, क्योंकि यदि पहला पैटर्न मेल नहीं खाता है तो यह लाइन को हटा देगा। – Rapsey

संबंधित मुद्दे