मैं एक फ़ाइल को "कैट" कैसे कर सकता हूं और टिप्पणी की गई पंक्तियों को हटा सकता हूं।


29

मैं जानना चाहूंगा कि क्या कोई ऐसा तरीका है जिसे मैं catपसंद कर सकता हूं php.iniऔर शुरू होने वाली सभी लाइनों को हटा सकता हूं;

उदाहरण के लिए, यदि फ़ाइल में यह है:

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

और मैंने सही कमांड चलाई cat | {remove comments command}, फिर मैं इसके साथ समाप्त हो गया:

error_reporting  =  E_ALL & ~E_NOTICE

नोट - मैं मान लिया है कि catयह करने के लिए सबसे अच्छा तरीका है, लेकिन मैं वास्तव में ठीक तरह एक और सुविधा का उपयोग जवाब के साथ कर रहा हूँ awk, sed, egrep, आदि


क्या कुछ पसंद है error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices? क्या उस मामले में भी टिप्पणी को हटाया जाना चाहिए?
सीवीएन

@ माइकलकॉर्जलिंग - मैं टिप्पणी के साथ शुरू होने वाली सिर्फ लाइनों के साथ वास्तव में ठीक हूं
cwd

1
catफ़ाइलों को संक्षिप्त करने का उपकरण है। grepपैटर्न के आधार पर लाइनों को फ़िल्टर करने का उपकरण है। sedऔर awkउन पंक्तियों को भी संशोधित कर सकते हैं।
स्टीफन चेजलस

जवाबों:



25

आपको किसी फ़ाइल को grep के माध्यम से पाइप करने की आवश्यकता नहीं है, grep फ़ाइल नाम (s) को कमांड लाइन आर्ग्स के रूप में लेता है।

grep -v '^#' file1 file2 file3

उन सभी पंक्तियों को प्रिंट करेगा जो उन लोगों से छूटती हैं जो एक # चर के साथ शुरू करते हैं। आप अपनी इच्छानुसार टिप्पणी को बदल सकते हैं।

यदि आपके पास एक से अधिक टिप्पणियाँ चार हैं (एक पंक्ति की शुरुआत में मान लें)

egrep -v '^(;|#|//)' filelist

2
एक और जो मैंने किया है वह हमेशा मेरे साथ रहा grep '^[^;]' filename। मैं हालांकि इसकी पोर्टेबिलिटी से बात नहीं कर सकता!
जोड़ी सी

@ जोडीसी, यह पोर्टेबल है, लेकिन खाली लाइनों (जो अक्सर वांछित है) को हटा देता है। के समकक्ष egrepहै grep -E। एक भी उपयोग कर सकते हैंgrep -ve '^[;#]' -e '^//'
स्टीफन चेज़लस 12

9

egrepआप के उपयोग को बचा सकते हैं cat। दूसरे शब्दों में, कम प्रक्रियाओं (बनाने egrepबनाम cat+ egrep) और कम बफ़र्स (से पाइप का उपयोग catकरने के लिए egrepबनाम कोई पाइप)।

यह आम तौर पर एक अच्छा विचार है कि catयदि आप किसी फाइल को केवल कमांड पर फाइल पास करना चाहते हैं तो इसे अपने आप ही पढ़ सकते हैं।

इस के साथ, निम्न कमांड टिप्पणियों को हटा देगा, भले ही वे रिक्त स्थान या टैब के साथ इंडेंट हों:

egrep -v '^ [[: blank:]] *;?] file.ini

मजेदार यह है कि आप कम से कम एक दशक के लिए पदावनत आदेश के उपयोग के साथ नए [[ चरित्र वर्ग ]] रेगेक्स प्रारूप को जोड़ते हैं egrep
mikeserv

दिलचस्प ... gnu.org/software/grep/manual/html_node/… पर वर्तमान डॉक्स POSIX क्लासेस शामिल हैं।
जैक वासे

7
egrep -v '^;|^$' $file

',', और खाली रेखाओं से शुरू होने वाली रेखाओं को बाहर करेगा।

रेगेक्स में, ^एक रेखा की शुरुआत और एक पंक्ति $के अंत को इंगित करता है , इसलिए ^$उन पंक्तियों को निर्दिष्ट करता है जहां रेखा चरित्र की शुरुआत और रेखा चरित्र की समाप्ति एक दूसरे के ठीक बगल में होती है।


इसलिए अगर मैं इस अधिकार को पढ़ रहा हूं तो यह टिप्पणी की गई पंक्तियों को हटा सकता है, लेकिन रिक्त लाइनों को भी?
cwd

1
@cwd हां। मुझे यकीन है कि क्यों वह दोनों शामिल नहीं हूँ, लेकिन अगर आप केवल टिप्पणी की लाइनों को हटाने के लिए चाहते हैं तो बस का उपयोगegrep -v '^;'
माइकल Mrozek

4
egrep को भी फ़ाइलें पसंद हैं (कम प्रक्रियाओं और उपयोग किए गए बफ़र्स), और एक छोटा सा बोनस भी इंडेंट की गई टिप्पणियों को हटाने के लिए होगा:egrep -v '^[[:blank:]]*;' file.ini
nrolans

10
हमें "बिल्ली का बेकार उपयोग" बिल्ला चाहिए।
साइमन रिक्टर

@nrolans - एक लोकप्रिय टिप्पणी की तरह लग रहा है, क्यों यह एक जवाब नहीं है?
cwd

2

एक साधारण awkएक-लाइनर awk '/^;/{next}1' input_fileको चाल करना चाहिए।

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 

3
सही, लेकिन क्रिया। बस awk '!/^;/' input_fileकाफी है।
मैनटवर्क

2

जयपाल के साथ-साथ, मैं भी शायद awkइन उद्देश्यों के लिए उपयोग करूंगा । यह उल्लेख करना बदतर है कि पर्ल ऐसे उद्देश्यों के लिए कभी-कभी काफी उपयोगी होता है:

cat data.txt | perl -lne "print unless /^;/"

पर्ल रीगेक्सप्स जाग के एक की तुलना में अधिक शक्तिशाली हैं और कभी-कभी आपको उनकी आवश्यकता हो सकती है।


Perl के लिए +1, हालाँकि बिल्ली और -l दोनों निरर्थक हैं, इसलिए एक सरल आह्वान हैperl -ne 'print unless /^;/' data.txt
साइमन व्हिटकर

@ सिस्मोन व्हिटकेर, हाँ, आप सही हैं - इसे लिखने की मेरी आदत है जैसे मैं लिखता हूँ, और यह उल्लेख के लायक है।
shabunc

1
ज़रूर। वास्तव में, मुझे लगता है कि catइन उदाहरणों में ठीक काम करता है यदि आप इसे अधिक जेनेरिक "एसटीडीटीएस पर कुछ भी उत्पन्न करने वाले पाठ" के लिए एक प्रॉक्सी के रूप में मानते हैं। कटा हुआ ब्रेड, इम्हो के बाद यूनिक्स पाइप सबसे अच्छी बात है। :)
साइमन व्हाइटेकर

2

@ Shabunc के उत्तर पर एक विस्तार, यह पर्ल से स्ट्रिप कमेंट्स (इनलाइन कॉमेंट्स सहित) का उपयोग करता है, फिर व्हॉट्सएप के अलावा किसी भी अन्य लाइन को प्रिंट करें।

$ perl -ne 's/;.*//; print if /\S/' data.txt

स्पष्टीकरण:

  • s/;.*//प्रतिस्थापन ऑपरेटर ( s/<regex>/<replacement>/) का उपयोग अर्ध-बृहदान्त्र के उदाहरणों को बदलने और खाली स्ट्रिंग के साथ एक पंक्ति में इसका पालन करने के लिए किया जाता है।
  • print if /\S/यदि यह regexp से मेल खाता है, तो रेखा को प्रिंट करता है \S, जो कि एक चरित्र वर्ग है जो सभी गैर-व्हाट्सएप पात्रों से मेल खाता है।

1

यहाँ एक है कि मैं का उपयोग करें, बस विकल्प ';' टिप्पणी चरित्र के साथ (उदाहरण के लिए, कई UNIX सेवा कॉन्फ़िगरेशन फ़ाइलों के लिए '#'):

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

यह सभी संपूर्ण लाइन टिप्पणियों (भले ही उनके पास व्हाट्सएप अग्रणी हो) से छुटकारा मिल जाता है, और कोई भी टिप्पणी जो गैर-टिप्पणी लाइनों को समाप्त करती है, और संक्षिप्त रूप से आउटपुट से रिक्त लाइनों को भी हटा देती है। यह पाइपलाइन के बिना संभव हो सकता है (मेरा sed- या awk- फ़्यू को वास्तव में महान नहीं है), लेकिन मेरे लिए यह समझना (और याद रखना) इतना आसान है, मुझे लगा कि मैं इसे यहाँ पोस्ट करूँगा।


1

उदाहरण केवल लाइनें दिखाते हैं + नई लाइनें या एमटीपी लाइनें नहीं दिखाते हैं:

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

या

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server

2
का उपयोग egrepलंबे समय से पदावनत है। grep -Eवह कमांड है जिसे आप यहां ढूंढ रहे हैं।
मिकसेर्व

0
egrep -v ^'(#|$)' file.txt

सभी टिप्पणियों और file.txt से खाली लाइनों को स्ट्रिप्स करें


2
आपको अपने जवाब के बारे में कुछ और जानकारी के लिए विस्तार करना चाहिए।
हालोसगॉस्ट जूल

egrepमूल्यह्रास किया गया है grep -Evइसके बजाय उपयोग करें ।
योकेई


0

आप नई फ़ाइल में # के साथ शुरू होने वाली खाली लाइनों और लाइनों को छोड़कर, लाइनों को बचाने के लिए निम्न कमांड का उपयोग कर सकते हैं

cat <file to be read> | egrep -v '^#|^$' > <file to be written at>


बेकार catपाइप और egrepमूल्यह्रास किया जाता है और grep -Eविस्तारित भावों के साथ या बस के लिए प्रतिस्थापित किया जाना है grep -v
योकाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.