আমি কীভাবে একটি ফাইল "বিড়াল" করতে পারি এবং মন্তব্য করা লাইনগুলি সরিয়ে ফেলতে পারি?


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? সেই ক্ষেত্রেও কি মন্তব্যটি মুছে ফেলা উচিত?
একটি সিভিএন

@ মাইকেলকার্জলিং - মন্তব্যগুলি সরানোর সাথে সাথে শুরু হওয়া লাইনের সাথে আমি সত্যিই ভাল আছি
সিডব্লুডে

1
catফাইলগুলি সংযুক্ত করার সরঞ্জাম। grepনিদর্শনগুলির উপর ভিত্তি করে লাইনগুলি ফিল্টার করার সরঞ্জাম। sedএবং awkসেই লাইনগুলিকে সংশোধন করতে পারে।
স্টাফেন চেজেলাস

উত্তর:



25

গ্রেপের মাধ্যমে আপনার কোনও ফাইল পাইপ করার দরকার নেই, গ্রেপ ফাইল-নাম কমান্ড লাইন আর্গ হিসাবে নেয়।

grep -v '^#' file1 file2 file3

# টি লেখার সাথে শুরু হওয়া সমস্ত লাইন ছাপবে। আপনি নিজের ইচ্ছামত মন্তব্যের চরিত্রটি পরিবর্তন করতে পারেন।

আপনার যদি একাধিক মন্তব্য চর থাকে (একটি লাইনের শুরুতে এটি ধরে নেওয়া)

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

2
আমি আর একটি কাজ করেছি যা সর্বদা আমার সাথে আটকে ছিল grep '^[^;]' filename। যদিও আমি এর বহনযোগ্যতার সাথে কথা বলতে পারি না!
জোডি সি

@ জোডিসি, এটি পোর্টেবল তবে খালি লাইনগুলিও সরিয়ে দেয় (যা প্রায়শই পছন্দসই হয়)। মান সমতুল্য egrepহয় grep -Egrep -ve '^[;#]' -e '^//'
একটিও

9

egrepআপনি ব্যবহার সংরক্ষণ করতে পারেন cat। অন্য কথায়, কম প্রসেস (তৈরি egrepবনাম cat+ + egrep) এবং কম বাফার (থেকে পাইপ ব্যবহার catকরতে egrepবনাম কোন নল)।

catআপনি যদি কেবল কোনও কমান্ডের কাছে কোনও ফাইল পাস করতে চান যা এটি নিজেই পড়তে পারে তবে এটির ব্যবহার সীমাবদ্ধ করা সাধারণত একটি ভাল ধারণা ।

এটি দিয়ে, নিম্নলিখিত কমান্ড মন্তব্যগুলি সরিয়ে ফেলবে, এমনকি তারা স্পেস বা ট্যাবগুলিতে অভিযুক্ত থাকলেও:

egrep -v '^ [[: ফাঁকা:]] *;' file.ini

মজার বিষয় হচ্ছে আপনি কমপক্ষে এক দশক বা তার বেশি সময় অবধি কমান্ডটি ব্যবহারের সাথে নতুন [[ চরিত্রের শ্রেণীর ]] রেজেক্স ফর্ম্যাটটি একত্রিত করেছেন egrep
মাইক্রজারভ

আকর্ষণীয় ... gnu.org/software/grep/manual/html_node/…থাকা বর্তমান দস্তাবেজগুলিতে পসিএক্স ক্লাস অন্তর্ভুক্ত রয়েছে।
জ্যাক ওয়াসে

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

এটি ';' এবং খালি লাইন দিয়ে শুরু হওয়া লাইনগুলি বাদ দেবে।

রেজেক্সে, ^একটি রেখার সূচনা এবং একটি রেখার $সমাপ্তি নির্দেশ করে , সুতরাং ^$রেখাগুলি নির্দিষ্ট করে যেখানে লাইন চরিত্রের শুরু এবং রেখার অক্ষরের সমাপ্তি একে অপরের ঠিক পাশেই রয়েছে।


সুতরাং আমি যদি এটি সঠিকভাবে পড়ছি তবে এটি মন্তব্য করা রেখাগুলি, তবে ফাঁকা লাইনগুলিও সরিয়ে ফেলতে পারে?
cwd

1
@ সিডব্লিউড হ্যাঁ তিনি কেন উভয়কে অন্তর্ভুক্ত করেছিলেন তা সম্পর্কে আমি নিশ্চিত নই, তবে আপনি যদি কেবল মন্তব্য করা লাইনগুলি সরাতে চান তবেegrep -v '^;'
মাইকেল মরোজেক

4
egrep ফাইলগুলিও খুব পছন্দ করে (কম প্রক্রিয়া এবং ব্যাফার ব্যবহৃত হয়), এবং একটি সামান্য বোনাস egrep -v '^[[:blank:]]*;' file.ini
হ'ল ইনডেন্ট করা

10
আমাদের "বিড়ালের অকেজো ব্যবহার" ব্যাজ দরকার।
সাইমন রিখটার

@ নরলানস - একটি জনপ্রিয় মন্তব্য বলে মনে হচ্ছে, কেন এটি একটি উত্তর দেয় না?
সিডব্লু

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যথেষ্ট।
manatwork

2

জয়পালের পাশাপাশি আমিও সম্ভবত awkএই উদ্দেশ্যে ব্যবহার করব। এটি উল্লেখ করা আরও খারাপ যে পার্ল কখনও কখনও এই জাতীয় উদ্দেশ্যে খুব কার্যকর হয়:

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

পার্কের রেগেক্সপস আর-কে-এর তুলনায় আরও শক্তিশালী এবং কখনও কখনও আপনার প্রয়োজন হয়।


পার্লের জন্য +1, যদিও বিড়াল এবং -l উভয় অপ্রয়োজনীয়, তাই একটি সহজ প্রার্থনা হ'লperl -ne 'print unless /^;/' data.txt
সাইমন হুইটেকার

@ সিমোন হুইটেকার, হ্যাঁ, আপনি ঠিক বলেছেন - আমি যেমন লিখি ঠিক তেমন এটি লেখার অভ্যাস এবং এটি উল্লেখ করা আমাদের পক্ষে মূল্যবান।
শাবঙ্ক

1
ঠিক. আসলে, আমি মনে করি catএই উদাহরণগুলিতে ভাল কাজ করে যদি আপনি এটিকে আরও সাধারণ "STDOUT- এ পাঠ্য উত্পন্ন করার কোনও জিনিস" এর প্রক্সি হিসাবে বিবেচনা করেন। কাটা রুটি, ইউহো থেকে ইউনিক্স পাইপই সেরা জিনিস। :)
সাইমন হুইটেকার

2

@ শাবঙ্কের উত্তরের একটি বিবরণ, এটি মন্তব্যগুলি ফেলার জন্য পার্ল ব্যবহার করে (ইনলাইন মন্তব্য সহ), তারপরে হোয়াইটস্পেস ব্যতীত অন্য যে কোনও লাইন মুদ্রণ করবে।

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

ব্যাখ্যা:

  • s/;.*//s/<regex>/<replacement>/একটি আধা-কোলন এবং খালি স্ট্রিংয়ের সাথে একটি লাইনে এটি অনুসরণ করা সমস্ত কিছু প্রতিস্থাপনের জন্য বিকল্প অপারেটর ( ) ব্যবহার করে ।
  • print if /\S/রেজিপ্লেক্সের সাথে মেলে যদি লাইনটি মুদ্রণ করে তবে এটি সমস্ত অ-হোয়াইটস্পেস অক্ষরের সাথে মেলে \Sএমন একটি অক্ষর শ্রেণি

1

এখানে আমি ব্যবহার করি, কেবলমাত্র বিকল্প ';' মন্তব্য অক্ষরের সাথে (যেমন 'অনেকগুলি ইউনিক্স পরিষেবা কনফিগারেশন ফাইলের জন্য' # '):

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

এটি সমস্ত সম্পূর্ণ-লাইন মন্তব্য (এমনকি তাদের সাদা শ্বেতক্ষেত্রের শীর্ষস্থানীয় হওয়া সত্ত্বেও) এবং কোনও মন্তব্য নয় এমন মন্তব্য লাইনগুলি থেকে পরিত্রাণ পেতে পারে এবং সংক্ষেপে আউটপুট থেকে ফাঁকা লাইনগুলি সরিয়ে দেয়। এটি পাইপলাইন ছাড়াই সম্ভব হতে পারে (আমার সিড- বা অ্যাজক-ফু স্বীকৃতভাবে দুর্দান্ত নয়) তবে এটি বুঝতে আমার পক্ষে এত সহজ (এবং মনে রাখবেন), আমি বুঝতে পেরেছিলাম যে আমি এটি এখানে পোস্ট করব।


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
ইয়োকাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.