"बिल्ली" और "चूहे" शब्द वाले टेक्स्ट फ़ाइल से सभी लाइनों को कैसे हटाएं?
"बिल्ली" और "चूहे" शब्द वाले टेक्स्ट फ़ाइल से सभी लाइनों को कैसे हटाएं?
जवाबों:
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