एक फ़ाइल से # के साथ शुरू होने वाली सभी लाइनों को हटा दें


182

एक फ़ाइल में टिप्पणियों के साथ सभी लाइनें शुरू होती हैं #। मैं उन सभी लाइनों (और केवल उन पंक्तियों) को कैसे हटा सकता हूं, जो शुरू होती हैं #? अन्य रेखाओं से युक्त #, लेकिन रेखा के आरंभ में नजरअंदाज नहीं किया जाना चाहिए।


1
क्या यह आम सम्मेलन के साथ काम करना है जो #blah \<nl>blahएक "तार्किक रेखा" के रूप में गिना जाता है क्योंकि बैकस्लैश नई रेखा से बच जाता है?
sarnold

@ सर्नॉल्ड: इसके अलावा make, कौन-सी यूटिलिटीज 'कॉमेंट खत्म करने से पहले' बैकस्लैश स्पाइस लाइनों का उपयोग करती हैं? गोले (बाश और ksh परीक्षण) नहीं है। सी और सी ++ प्रीप्रोसेसर निर्देशों के अन्य प्रसंस्करण से पहले न्यूलाइन स्पाइलिंग को संभालते हैं, लेकिन वे टिप्पणियों के बजाय निर्देश हैं।
जोनाथन लेफ़लर

@ जोनाथन: बहुत बढ़िया। मैंने मान लिया था कि आम \<nl>बचना भी टिप्पणियों पर काम करेगा। लेकिन वाह मैं गलत था। मुझे अभी तक एक और उदाहरण नहीं मिला है ... :) धन्यवाद!
snold

जवाबों:


301

यह एक वन-लाइनर के साथ किया जा सकता है :

sed '/^#/d'

यह कहता है, "सभी पंक्तियों को खोजें जो # से शुरू होती हैं और उन्हें हटा देती हैं, और सब कुछ छोड़ देती हैं।"


9
छोटा संस्करण:sed /^#/d
केव

80
मेरे जैसे लाइनक्स नॉब्स के लिए:sed '/^#/ d' < inputFile.txt > outputFile.txt
नील मैकगैगन

49
सबसे छोटा संस्करण sed -i '/^#/d' filepath:।
गूलर

14
और sed -i '' '/^#/d' filepathमैक पर ( क्योंकि -i प्रत्यय अनिवार्य है )
paulcm

1
@Viesturs यह कोशिश करो: awk '/^#/ && !first { first=1 ; next } { print $0}'
रेमंड Hettinger

56

मैं थोड़ा हैरान हूं कि किसी ने भी सबसे स्पष्ट समाधान का सुझाव नहीं दिया है:

grep -v '^#' filename

यह समस्या को हल करता है जैसा कि कहा गया है।

लेकिन ध्यान दें कि एक आम सम्मेलन #एक टिप्पणी के रूप में माना जाने वाला एक पंक्ति के अंत से सब कुछ के लिए है :

sed 's/#.*$//' filename

हालांकि, वह व्यवहार करता है, उदाहरण के लिए, एक #स्ट्रिंग के भीतर एक चरित्र एक टिप्पणी की शुरुआत के रूप में (जो आपके मामले के लिए प्रासंगिक हो सकता है या नहीं भी हो सकता है) (और यह खाली लाइनें छोड़ता है)।

मनमाने ढंग से व्हाट्सएप से शुरू होने वाली एक पंक्ति #को भी एक टिप्पणी के रूप में माना जा सकता है:

grep -v '^ *#' filename

यदि व्हाट्सएप केवल रिक्त स्थान है, या

grep -v '^[  ]#' filename

जहां दो स्थान वास्तव में एक शाब्दिक टैब वर्ण (टाइप "कंट्रोल-वी टैब") के बाद का स्थान है।

इन सभी आदेशों के लिए, filenameमानक इनपुट (जैसे, पाइप के भाग के रूप में) से पढ़ने के तर्क को छोड़ दें ।


मैंने एक नया उत्तर जोड़ा है जो इस उत्तर पर बनाता है।
एक्यूमेनस

मुझे विंडोज पर इस तरह से जीआरईपी का उपयोग करने में परेशानी हुई। इसका समाधान 'द्वारा' को बदलना है, जैसेgrep -v "^#" filename
सर्ग

14

रेमंड के समाधान के विपरीत:

sed -n '/^#/!p'

"कुछ भी प्रिंट न करें, सिवाय उन लाइनों के जो # के साथ शुरू नहीं होती हैं"


8

आप सीधे अपनी फ़ाइल को संपादित कर सकते हैं

sed -i '/^#/ d'

यदि आप भी कुछ व्हाट्सएप उपयोग के साथ शुरू होने वाली टिप्पणी लाइनों को हटाना चाहते हैं

sed -i '/^\s*#/ d'

आमतौर पर, आप अपनी स्क्रिप्ट की पहली पंक्ति रखना चाहते हैं, अगर यह एक श-बैंग है, तो इससे sedशुरू होने वाली लाइनों को नहीं हटाना चाहिए #!। यह भी लाइनों को नष्ट करना चाहिए, कि सिर्फ एक हैश लेकिन कोई पाठ शामिल हैं। इसे एक साथ रखें:

sed -i '/^\s*\(#[^!].*\|#$\)/d'

सभी सेडान वेरिएंट के अनुरूप होने के लिए आपको -iविकल्प में बैकअप एक्सटेंशन जोड़ना होगा :

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak

प्लस 1 जो एक स्थान के लिए है
deepaksingh pawar


5

यह उत्तर कीथ द्वारा पहले के उत्तर पर बनाया गया है

egrep -v "^[[:blank:]]*#" टिप्पणी लाइनों को फ़िल्टर करना चाहिए।

egrep -v "^[[:blank:]]*(#|$)" दोनों टिप्पणियों और खाली लाइनों को फ़िल्टर करना चाहिए, जैसा कि अक्सर उपयोगी होता है।

[:blank:]अन्य वर्ण वर्ग के बारे में जानकारी के लिए , https://en.wikipedia.org/wiki/Regular_expression#Character_classes देखें


अपने egrepसिंटैक्स का समर्थन करते हुए मान लें कि; पुराने संस्करण नहीं हो सकते हैं।
कीथ थॉम्पसन

-3

यह कुछ विस्तार के साथ सभी फाइलों के लिए एक लूप के साथ है:

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.