कुछ अभिव्यक्तियों के अनुसार मैं 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
निर्देश देने के लिए कैसे इनपुट से मेल नहीं खाने वाले लाइनों की अनदेखी करने के लिए है चारों ओर जा रहा तरह दिखता है। तो हम इसे कैसे करते हैं?
ओएस एक्स 10.8.2 पर मुझे अर्धविराम की बजाय एक नई लाइन के साथ 'tx' और' d' को अलग करना पड़ा क्योंकि मुझे 'अपरिभाषित लेबल 'x; d;: x'' मिल रहा था। – davidchambers
यहां तक कि बेहतर: 'sed -e's /.../.../ '-e' tx '-e' d '-e': x'' (एक [समान प्रश्न] पर एक टिप्पणी में सुझाया गया है (http : //stackoverflow.com/a/1252191/312785))। – davidchambers
'टी' स्क्रिप्ट के अंत में स्थानांतरित नहीं होगा यदि कोई लेबल प्रदान नहीं किया गया है, तो आसान: 'sed -e' s /.../.../ '-e' t '-e' d''। –