XY से छोटी लाइनों को कैसे हटाएं?


29

मुझे इस बारे में एक प्रश्न मिला, कि कैसे २०४: वर्णों की लंबी लाइनों को हटाया जाए:

XY से अधिक लंबी लाइन को कैसे हटाएं?

प्रश्न: लेकिन मैं कैसे 4 से छोटी लाइनों को हटा सकता हूं? इसलिए उन पंक्तियों को हटा दें जिनकी फ़ाइल में 1 या 2 या 3 लंबाई है।

अद्यतन: कई अच्छे जवाब के लिए धन्यवाद, लेकिन मैं केवल एक को ठीक के रूप में चिह्नित कर सकता हूं

जवाबों:


42

आप उपयोग कर सकते हैं sed। निम्नलिखित उन पंक्तियों को हटा देगा जो 3 वर्ण लंबी या छोटी हैं:

sed -r '/^.{,3}$/d' filename

फ़ाइल में किए गए परिवर्तनों को सहेजने के लिए, -iविकल्प की आपूर्ति करें ।

यदि आपका संस्करण sedविस्तारित RE सिंटैक्स का समर्थन नहीं करता है, तो आप BRE में समान लिख सकते हैं:

sed '/^.\{,3\}$/d' filename

जो सभी sedप्रकारों के साथ काम करेगा ।


आप यह भी उपयोग कर सकते हैं awk:

awk 'length($0)>3' filename

का उपयोग कर perl:

perl -lne 'length()>3 && print' filename

sed '/^.\{,3\}$/d'BSD sed के साथ काम नहीं करता है sed: 1: "/^.\{,3\}$/d": RE error: invalid repetition count(s):। Sed -r संस्करण वाक्यविन्यास रूप से मान्य है, लेकिन लाइनों को नहीं हटाएगा।
डेरेकसन

5

कुछ और बदलाव:

grep .... file

या

sed '/..../!d' file

या

sed -n 's/./&/4p' file

या

awk 'gsub(/./,"&")>3' file

या

awk 'length>3' file

या GNU awk:

awk 'NF>3' FS= file

1
ओह, उस grep .... बहुत सुंदर है!
grofte

3

यहाँ Vim के Ex मोड और globalकमांड का उपयोग करके Vim सॉल्यूशन दिया गया है।

यह उपयोग करने के लिए बहुत समान है sed, केवल यह कि कुछ विशेष वर्ण ('{', '}') से बचने की आवश्यकता है।

:g/^.\{,3\}$/d

Vim's Very Magic Regex मोड (\ v) का उपयोग करके, इस पलायन से बचा जा सकता है।

:g/\v^.{,3}$/d

यह भी देखें: जादू की मदद

Use of "\v" means that in the pattern after it all ASCII characters except
'0'-'9', 'a'-'z', 'A'-'Z' and '_' have a special meaning.  "very magic"

इसके अलावा कभी-कभी उपयोगी इसके विपरीत करना है vglobal

:v/\v^.{,3}$/d

सब कुछ हटा देगा, लेकिन 3 वर्णों तक की लाइनें।


1

उन लाइनों को सीधे हटाने के लिए जिन्हें आप कर सकते हैं:

sed -ri '/.{4}/!d' /path/to/file

या BRE:

sed -i '/.\{4\}/!d' /path/to/file

यदि किसी पंक्ति में 4 या अधिक वर्ण नहीं हैं, तो उसे हटा दिया जाता है।

f=/path/to/file
cat <<GREP >"$f"
    $(grep -E ".{4}" "$f")
GREP

कमांड-प्रतिस्थापन उपखंड में उपरोक्त करना सुनिश्चित करेगा कि grepबिल्ली उस पर लिखना शुरू करने से पहले उस पर एक पढ़ने वाला विवरणक प्राप्त कर ले, लेकिन यह <<HEREDOCभी सुनिश्चित करेगी कि परिणाम प्रवाहित रहे और तर्क लंबाई त्रुटियों का कारण न बने।



0

आप उपयोग कर सकते हैं grep:

यदि आप पंक्ति की लंबाई में अग्रणी स्थान गिनते हैं:

grep -e '[^\ ]\{4,\}' file

यदि आप पंक्ति के झुकाव में अग्रणी स्थानों की गिनती नहीं करते हैं:

grep -e '[^\]\{4,\}' file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.