बहुत सी पंक्तियों वाली फ़ाइल में मैं उन पंक्तियों को हटाना चाहता हूँ, जो शुरू होती हैं HERE IT IS
।
केवल कमांड-लाइन टूल का उपयोग करके मैं यह कैसे कर सकता हूं?
बहुत सी पंक्तियों वाली फ़ाइल में मैं उन पंक्तियों को हटाना चाहता हूँ, जो शुरू होती हैं HERE IT IS
।
केवल कमांड-लाइन टूल का उपयोग करके मैं यह कैसे कर सकता हूं?
जवाबों:
कोशिश करें sed
:
sed -i '/^HERE IT IS/d' <file>
चेतावनी:-i
स्विच का उपयोग करते समय बैकअप लेना बेहतर है sed
:
sed -i.bak '/^HERE IT IS/d' <file>
मूल फ़ाइल इस प्रकार रहेगी <file>.bak
और संशोधित फ़ाइल होगी <file>
।
sed -i 's/^HERE IT IS/HERE IT IS\n/' <file>
sed '/^HERE IT IS/G' file
।
आपके द्वारा प्राप्त किए गए बहुत अच्छे grep
और sed
उत्तर के अलावा , यहां कुछ अन्य उपकरण हैं जो समान कार्य कर सकते हैं:
कुछ पर्ल तरीके:
perl -ne '/^HERE IT IS/ || print' file > newfile
perl -ne 'print if !/^HERE IT IS/' file > newfile
perl -ne 'print unless /^HERE IT IS/' file > newfile
आप -i
फ़ाइल को संपादित करने के लिए किसी भी उदाहरण में स्विच जोड़ सकते हैं :
perl -i.bak -ne '/^HERE IT IS/ || print' file
(छ) awk
awk '!/^HERE IT IS/' file > newfile
GNU के नए संस्करण (4.1.1 और बाद में) awk
( awk
लिनक्स पर डिफ़ॉल्ट ) भी जगह में फ़ाइल को संपादित कर सकते हैं:
gawk -i inplace '!/^HERE IT IS/' file
शेल ( bash
और zsh
, ksh
शायद, अन्य)। यह एक तरह से मूर्खतापूर्ण है, यह किया जा सकता है लेकिन अन्य उपकरण बेहतर हैं।
while IFS= read -r line; do
[[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
done < file > newfile
bash
एक ने मुझे LOL बनाया है)
printf "%s\n" "$line"
: व्हाट्सएप को संरक्षित करने के लिए $ लाइन को उद्धृत करना , और कुछ गूंज समस्याओं (विशेष चार्ट आदि की व्याख्या) से बचना। और जोड़ने की आवश्यकता से बचा जाता --
है।
IFS=
और -r
, मैं सभी तरह से जा सकता हूं और मजबूत बना सकता हूं।
sed
निश्चित रूप से जाने का रास्ता है।
आदेश @heemayl के इस मामूली संशोधन से आपको यह पता चल जाएगा कि पैटर्न संदर्भ में I के कारण पैटर्न में एक ही मामले का उपयोग किया जाता है या नहीं।
sed -i '/HERE IT IS/Id' <file>
यदि आपके पास एक निर्देशिका में कई फाइलें थीं जो आप इस पर करना चाहते थे, तो आप इसे इस तरह से जोड़ सकते हैं।
find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +
Maxdepth विकल्प का अर्थ है कि यह निर्देशिकाओं में पुनरावृत्ति नहीं करेगा।
एक और अजगर विकल्प:
#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
जहाँ f फाइल के लिए रास्ता है, उद्धरणों के बीच।
ग्रेप
grep -P '^(?!HERE IT IS)' file
(?!HERE IT IS)
नकारात्मक लुकहेड अभिकथन जो रेगेक्स इंजन को सीमा से शुरू होने वाली सभी रेखा से मेल खाने के लिए बनाता है ( जो आमतौर पर मेल खाता है^
) केवल अगर यह स्ट्रिंग द्वारा पीछा नहीं किया जाता हैHERE IT IS
अजगर
#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
for line in f:
if not line.startswith('HERE IT IS'):
print(line, end="")
स्क्रिप्ट को किसी फ़ाइल में सहेजें, कहें script.py
और फिर टर्मिनल पर नीचे दिए गए कमांड के माध्यम से चलाएं।
python3 script.py infile
[print(l, end = "") for l in open(fil).readlines() if not re.match("HERE IT IS", l)]
, लेकिन यह उससे अधिक कुशल नहीं है startswith
। मुझे आश्चर्य हुआ कि [print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]
किसी सूची में आउटपुट कैसे नहीं होगा।
आप पूर्व मोड में विम का उपयोग कर सकते हैं:
ex -sc 'g/^HERE IT IS/d' -cx file
g
वैश्विक खोज
d
हटाना
x
सहेजें और बंद करें
vim
तो जैसे:vim '+g/^HERE IT IS/d' +wq test.txt
;)