"बिल्ली" और "चूहे" शब्द वाले टेक्स्ट फ़ाइल से सभी लाइनों को कैसे हटाएं?
"बिल्ली" और "चूहे" शब्द वाले टेक्स्ट फ़ाइल से सभी लाइनों को कैसे हटाएं?
जवाबों:
grep
पहुंच"बिल्ली" या "चूहे" से मेल खाती लाइनों के बिना फ़ाइल की एक प्रति बनाने के लिए, कोई grep
रिवर्स ( -v
) और पूरे-शब्द विकल्प ( -w
) के साथ उपयोग कर सकता है ।
grep -vwE "(cat|rat)" sourcefile > destinationfile
पूरे शब्द विकल्प यह सुनिश्चित करता है कि यह मेल नहीं खाएगा cats
या grateful
उदाहरण के लिए। आपके शेल के आउटपुट पुनर्निर्देशन का उपयोग ( >
) एक नई फ़ाइल में लिखने के लिए किया जाता है । हमें सिंटैक्स के -E
लिए विस्तारित नियमित अभिव्यक्तियों को सक्षम करने के लिए विकल्प की आवश्यकता है (one|other)
।
sed
पहुंचवैकल्पिक रूप से, इन-लाइन्स को हटाने के लिए एक का उपयोग कर सकते हैं sed -i
:
sed -i "/\b\(cat\|rat\)\b/d" filename
\b
सेट शब्द सीमाओं और d
आपरेशन फ़ॉरवर्ड स्लैश के बीच अभिव्यक्ति मिलान लाइन हटा देता है। cat
और rat
दोनों (one|other)
सिंटेक्स द्वारा मिलान किए जा रहे हैं, हमें स्पष्ट रूप से बैकस्लैश के साथ भागने की आवश्यकता है।
युक्ति: फ़ाइल को अधिलेखित करने से पहले कमांड के आउटपुट का परीक्षण करने के sed
लिए -i
ऑपरेटर के बिना उपयोग करें ।
( सेड के आधार पर - एक विशिष्ट स्ट्रिंग वाली लाइन हटाएं )
केवल टर्मिनल में परीक्षण करने के लिए, उपयोग करें:
sed '/[cr]at/d' file_name
फ़ाइल से उन पंक्तियों को वास्तव में निकालने के लिए, उपयोग करें:
sed -i '/[cr]at/d' file_name
यदि आप के साथ फ़ाइल है पर विचार करें file_name
और आप माउस के लिए खोज करना चाहते हैं, लेकिन माउस से कुछ पंक्तियों की तरह दूसरे शब्दों होने एक ही समय पर cat
और rat
और आप अपने उत्पादन में उन लोगों के देखने के लिए नहीं करना चाहते हैं, तो एक तरह से यह है क्या करने के लिए -
grep -r mouse file_name | grep -vE "(cat|rat)"
में काम करता है /bin/sh
, जो dash
उबंटू पर है, साथ ही साथ ksh
, और bash
। थोड़ा अजीब है कि आपको case
बयान में प्रत्येक शब्द के लिए कई परीक्षण मामलों को लिखना होगा लेकिन पोर्टेबल। ऐसे मामलों के साथ काम करता है जहाँ शब्द लाइन पर, लाइन के अंत में, या लाइन के मध्य में अकेला दिखाई देता है, और जहाँ यह दूसरे शब्द का हिस्सा हो सकता है, उसे अनदेखा करता है।
#!/bin/sh
line_handler(){
# $1 is line read, prints to stdout
case "$1" in
cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
rat|rat\ *|*\ rat\ *|*\ rat) true;;
*) printf "%s\n" "$1"
esac
}
readlines(){
# $1 is input file, the rest is words we want to remove
inputfile="$1"
shift
while IFS= read -r line;
do
line_handler "$line" "$@"
done < "$inputfile"
[ -n "$line" ] && line_handler "$line"
}
readlines "$@"
और यह है कि यह कैसे काम करता है:
$ cat input.txt
the big big fat cat
the cat who likes milk
jumped over gray rat
concat
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt
concat
this is catchy
rational
irrational