मैं एक विशिष्ट स्ट्रिंग वाले टेक्स्ट फ़ाइल में सभी लाइनों को हटाने के लिए sed का उपयोग कैसे करूंगा?
मैं एक विशिष्ट स्ट्रिंग वाले टेक्स्ट फ़ाइल में सभी लाइनों को हटाने के लिए sed का उपयोग कैसे करूंगा?
जवाबों:
लाइन को हटाने के लिए और आउटपुट को मानक से प्रिंट करने के लिए:
sed '/pattern to match/d' ./infile
फ़ाइल को सीधे संशोधित करने के लिए - बीएसडी sed के साथ काम नहीं करता है:
sed -i '/pattern to match/d' ./infile
वही, लेकिन BSD sed (Mac OS X और FreeBSD) के लिए - GNU sed के साथ काम नहीं करता है:
sed -i '' '/pattern to match/d' ./infile
फ़ाइल को सीधे संशोधित करने के लिए (और बैकअप बनाएं) - BSD और GNU sed के साथ काम करता है:
sed -i.bak '/pattern to match/d' ./infile
sed '/pattern to match/d' ./infile > ./newfile
या यदि आप इन-प्लेस एडिट करना चाहते हैं तो आप -i
फ्लैग को जोड़ सकते हैं जैसा कि इन में है sed -i '/pattern to match/d' ./infile
। ध्यान दें कि -i
ध्वज को GNU sed की आवश्यकता है और यह पोर्टेबल नहीं है
sed -i.backup '/pattern to match/d' ./infile
) जो मुझे इन-प्लेस संपादन के साथ मिला।
sed
किसी भी फाइल की तरह कमांड लागू नहीं करते हैं जो संस्करण-नियंत्रित नहीं हैं।
sed -i '' '/pattern/d' ./infile
।
विशिष्ट स्ट्रिंग के साथ लाइनों को हटाने के कई अन्य तरीके हैं sed
:
awk '!/pattern/' file > temp && mv temp file
ruby -i.bak -ne 'print if not /test/' file
perl -ni.bak -e "print unless /pattern/" file
while read -r line
do
[[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file
grep -v "pattern" file > temp && mv temp file
और निश्चित रूप से sed
(उलटा मुद्रण वास्तविक विलोपन की तुलना में तेज़ है):
sed -n '/pattern/!p' file
sed
उदाहरण के लिए एक अलग व्यवहार कर, यह केवल greps! यह कुछ ऐसा होना चाहिए sed -n -i '/pattern/!p' file
।
grep -v "pattern" file > temp; mv temp file
यह रिटर्न वैल्यू के आधार पर कुछ अन्य उदाहरणों पर लागू हो सकता है।
seq -f %f 10000000 >foo.txt
:। sed d: time sed -i '' '/6543210/d' foo.txt
वास्तविक 0m9.294s। sed! p: time sed -i '' -n '/6543210/!p' foo.txt
वास्तविक 0m13.671s (छोटी फाइलों के लिए, अंतर बड़ा है।)
आप फ़ाइल में लाइनों को बदलने के लिए sed का उपयोग कर सकते हैं। हालाँकि, यह दूसरी फ़ाइल में व्युत्क्रम के लिए grep का उपयोग करने की तुलना में बहुत धीमा प्रतीत होता है और फिर मूल पर दूसरी फ़ाइल को स्थानांतरित करता है।
जैसे
sed -i '/pattern/d' filename
या
grep -v "pattern" filename > filename2; mv filename2 filename
वैसे भी मेरी मशीन पर पहले कमांड को 3 गुना अधिक समय लगता है।
sed '/pattern/d' filename > filename2; mv filename2 filename
GNU के साथ इसे करने का आसान तरीका sed
:
sed --in-place '/some string here/d' yourfile
-r
विकल्प का प्रयास करें (या -E
, आपके संस्करण पर निर्भर करता है)। इस regex अक्षरों से परे का उपयोग सक्षम बनाता है +
, ?
, {...}
और (...)
।
आप का उपयोग करने पर विचार कर सकते हैं ex
(जो एक मानक यूनिक्स कमांड-आधारित संपादक है):
ex +g/match/d -cwq file
कहाँ पे:
+
निष्पादित पूर्व कमान ( man ex
), उसी के रूप में -c
निष्पादित wq
(लिखते हैं और छोड़ें)g/match/d
- दिए गए के साथ लाइनों को हटाने के लिए पूर्व कमान match
, देखें: जी की शक्तिउपर्युक्त उदाहरण Unix.SE और POSIX विनिर्देशों के लिएex
इस पोस्ट के अनुसार किसी फ़ाइल को इन-प्लेस एडिट करने के लिए एक POSIX-compliant तरीका है ।
अंतर sed
यह है कि:
sed
एक है एस tream प्रवर्तन निदेशालय itor, न कि एक फ़ाइल संपादक। BashFAQ
जब तक आप गैर-लाभकारी कोड, I / O ओवरहेड और कुछ अन्य बुरे दुष्प्रभावों का आनंद नहीं लेते हैं। तो मूल रूप से कुछ पैरामीटर (जैसे कि इन-प्लेस / -i
) गैर-मानक FreeBSD एक्सटेंशन हैं और अन्य ऑपरेटिंग सिस्टम पर उपलब्ध नहीं हो सकते हैं।
man ex
यह मेरे लिए आदमी देता है vim
, ऐसा लगता है ex
vim का हिस्सा है ... अगर मैं के लिए सही है कि साधन पैटर्न सिंटैक्स समझ match
है vimregex.com जो समान है, लेकिन POSIX और PCRE जायके के लिए अलग है?
मैं मैक पर इसके साथ संघर्ष कर रहा था। साथ ही, मुझे वैरिएबल रिप्लेसमेंट का उपयोग करने की आवश्यकता है।
इसलिए मैंने इस्तेमाल किया:
sed -i '' "/$pattern/d" $file
जहां $file
फ़ाइल जहां विलोपन जरूरत है और$pattern
पैटर्न को हटाने के लिए मिलान किया जा रहा है।
मैंने ''
इस टिप्पणी से उठाया ।
यहाँ ध्यान देने वाली बात दोहरे उद्धरण चिह्नों का उपयोग है "/$pattern/d"
। जब हम सिंगल कोट्स का उपयोग करते हैं तो वैरिएबल काम नहीं करेगा।
sed
बाद एक पैरामीटर की आवश्यकता होती है -i
, इसलिए यदि आप बैकअप नहीं चाहते हैं, तो आपको अभी भी एक खाली स्ट्रिंग जोड़ना होगा:-i ''
sed -i "/$pattern/d" $file
। आपके उत्तर के लिए धन्यवाद।
मैंने एक फ़ाइल के साथ एक छोटा बेंचमार्क बनाया है जिसमें लगभग 345 000 लाइनें हैं। के साथ जिस तरह से grep
लगभग 15 गुना तेजी से लगता हैsed
इस मामले में विधि की ।
मैंने LC_ALL = C की सेटिंग के साथ और उसके बिना, दोनों की कोशिश की है, ऐसा नहीं लगता कि यह समय में काफी बदलाव करता है। खोज स्ट्रिंग (CDGA_00004.pdbqt.gz.tar) फ़ाइल के बीच में कहीं है।
यहाँ आदेश और समय हैं:
time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt
real 0m0.711s
user 0m0.179s
sys 0m0.530s
time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt
real 0m0.105s
user 0m0.088s
sys 0m0.016s
time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )
real 0m0.046s
user 0m0.014s
sys 0m0.019s
आप इसका उपयोग भी कर सकते हैं:
grep -v 'pattern' filename
यहां -v
आपके पैटर्न के अलावा केवल प्रिंट होगा (इसका मतलब है कि इनवर्ट मैच)।
perl -i -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3
पहला कमांड फ़ाइल (ओं) को inplace (-i) को एडिट करता है।
दूसरा कमांड एक ही काम करता है लेकिन मूल फ़ाइल (ओं) को .bk को फ़ाइल नामों (.bk को कुछ भी बदला जा सकता है) में जोड़कर कॉपी या बैकअप रखता है।
बस अगर कोई इसे स्ट्रिंग्स के सटीक मैचों के लिए करना चाहता है, तो आप -w
पूरे के लिए grep - w में ध्वज का उपयोग कर सकते हैं । उदाहरण के लिए, यदि आप उन पंक्तियों को हटाना चाहते हैं जिनकी संख्या 11 है, लेकिन 111 नंबर वाली पंक्तियों को रखें:
-bash-4.1$ head file
1
11
111
-bash-4.1$ grep -v "11" file
1
-bash-4.1$ grep -w -v "11" file
1
111
-f
यदि आप एक साथ कई सटीक पैटर्न को बाहर करना चाहते हैं तो यह ध्वज के साथ भी काम करता है । यदि "ब्लैकलिस्ट" प्रत्येक लाइन पर कई पैटर्न के साथ एक फाइल है जिसे आप "फाइल" से हटाना चाहते हैं:
grep -w -v -f blacklist file
-w, --word-regexp Select only those lines containing matches that form whole words.
बनाम-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
cat filename | grep -v "pattern" > filename.1
mv filename.1 filename
उपचारित पाठ को कंसोल में दिखाने के लिए
cat filename | sed '/text to remove/d'
एक फ़ाइल में इलाज पाठ को बचाने के लिए
cat filename | sed '/text to remove/d' > newfile
एक मौजूदा फ़ाइल के इलाज के पाठ को जोड़ने के लिए
cat filename | sed '/text to remove/d' >> newfile
पहले से ही इलाज किए गए पाठ का इलाज करने के लिए, इस मामले में जो हटा दिया गया है उसकी अधिक पंक्तियों को हटा दें
cat filename | sed '/text to remove/d' | sed '/remove this too/d' | more
| more
एक समय में एक पेज के मात्रा में पाठ दिखाई देगा।
आप अच्छे पुराने उपयोग कर सकते हैं ed
संपादित करने के लिए करने के लिए इसी तरह से एक फाइल जवाब है कि का उपयोग करता है ex
। इस मामले में बड़ा अंतर यह है कि ed
इसकी कमांड मानक इनपुट के माध्यम से होती है, न कि कमांड लाइन आर्ग्युमेंट जैसे कि ex
। एक स्क्रिप्ट में इसका उपयोग करते समय, इसे समायोजित करने का सामान्य तरीका इसके printf
लिए पाइप कमांड का उपयोग करना है:
printf "%s\n" "g/pattern/d" w | ed -s filename
या एक वंशानुगत के साथ:
ed -s filename <<EOF
g/pattern/d
w
EOF