আমি কীভাবে কোনও ফাইল থেকে সমস্ত মন্তব্য মুছে ফেলতে পারি?


21

আমার কাছে মন্তব্য সহ একটি ফাইল রয়েছে:

foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this

আমি কেবল সমস্ত অনিবন্ধিত কোড মুদ্রণ করতে চাই:

foo
bar
stuff
morestuff
evenmorestuff

কোনও ফাইলের বাইরে মন্তব্যগুলি ছাঁটাতে সক্ষম হওয়া এত গুরুত্বপূর্ণ ... এটি করার ভাল উপায় কী?


1
আপনি গ্রেপ সহ একটি লাইনের অংশগুলি সরাতে পারবেন না। আপনি
এটির

2
আপনার পাঠ্য এবং আপনার উদাহরণ বিরোধিতা করে। আপনি মন্তব্য করা লাইনগুলি সম্পর্কে লিখেছেন, তবে শেষ লাইন থেকে স্পষ্টভাবে আপনি লাইনের অংশগুলি বোঝাচ্ছেন। এবং তারপরে কোনও মন্তব্য সহ প্রথম লাইনটি EOL সহ মুছে ফেলা হবে এবং দ্বিতীয় দ্বিতীয়টি হতে পারে তবে এটি শেষ লাইন হিসাবে এটি পরিষ্কার নয় clear আপনার উদাহরণগুলি নিখুঁত করে নিখুঁত করতে দয়া করে 'লাইনগুলি মন্তব্য করেছেন' পুনরায় চাপ দিন।
অ্যান্টন

5
ব্যবহার করার চেষ্টা করুন awk -F\# '$1!="" { print $1 ;} '
আরকেমার

2
কিভাবে একটি লাইন echo '#' # output a #হ্যান্ডেল করা হবে?
কুসালানন্দ

3
@ কিউশনেশনমার্ক আমি বুদ্ধিমান হতে পারি, তবে আমি লিখছি না শেল-ব্যাকরণ-পার্সার চালাক।
কুসালানন্দ

উত্তর:


40

সমস্ত মন্তব্য মুছে ফেলার একটি উপায় বিকল্প grepসহ ব্যবহার করা -o:

grep -o '^[^#]*' file

কোথায়

  • -o: কেবলমাত্র লাইনের অংশের সাথে মিলে যায় ints
  • প্রথম ^: লাইনের শুরু
  • [^#]*: #পুনরাবৃত্তি শূন্য বা তার বেশি বার ব্যতীত অন্য কোনও অক্ষর

মনে রাখবেন যে খালি লাইনগুলিও মুছে ফেলা হবে, তবে কেবলমাত্র স্পেস সহ লাইন থাকবে।


2
আমি ব্যবহার করবgrep -v '^#' file > newfilewithoutcomments
বেসাইল স্টারিনকিভিচ

1
এটি লক্ষ করা উচিত যে এটি শেল স্ক্রিপ্টগুলির জন্য সাধারণ পদ্ধতি নয়, উদাহরণস্বরূপ লাইনটি somvar='I am a long complicated string ## with special characters' # and I am a commentসঠিকভাবে পরিচালনা করা হবে না।
ওয়াইল্ডকার্ড

এই রূপটি আমার জন্য আরও ভালভাবে কাজ করে (একটি ম্যাকের জন্য):grep -o '^[^#].*' file
পিয়ার্জ

মন্তব্যগুলি গেছে তবে আমি আউটপুটে তাদের জায়গায় একগুচ্ছ শ্বেত স্থান দেখছি? sedসমাধানটিতে কেবল একটি ফাঁকা রেখা আছে, অন্য উত্তরটি ব্যবহার করার জন্য দৃ argument় যুক্তির মতো মনে হচ্ছে, যদি না আমি কিছু মিস করছি?
জেবালিন

@ জ্যাবলিন আপনি grepসম্ভবত কিছু উপকরণ সংজ্ঞায়িত করেছেন ? নমুনা ইনপুট পোস্ট করার পরেও যদি স্থানগুলি দেখতে পান তবে এটিকে পরিবর্তন grepকরে command grepদেখুন।
জিম্মিজ

31

আমি বিশ্বাস করি sedএর চেয়ে আরও ভাল একটা কাজ করতে পারে grep। এটার মতো কিছু:

sed '/^[[:blank:]]*#/d;s/#.*//' your_file

ব্যাখ্যা

  • sedডিফল্টরূপে আপনার ফাইল লাইনটি লাইন দ্বারা দেখবে এবং সম্ভবত উদ্ধৃতিগুলিতে রূপান্তরগুলি প্রয়োগ করার পরে প্রতিটি লাইন মুদ্রণ করবে। (sed '' your_file কেবলমাত্র সমস্ত লাইন অপরিবর্তিতভাবে মুদ্রণ করবে)।
  • এখানে আমরা দিচ্ছি sed প্রতিটি লাইনে দুটি কমান্ড দিচ্ছি (সেগুলি সেমিকোলন দ্বারা পৃথক করা হয়েছে)।
  • প্রথম আদেশটি বলে: /^[[:blank:]]*#/d। ইংরাজীতে, এর অর্থ যদি লাইনটি শুরুতে কোনও হ্যাশের সাথে মিলে যায় (যে কোনও সংখ্যক নেতৃস্থানীয় ফাঁকা অংশ আগে), সেই লাইনটি মুছুন (এটি মুদ্রিত হবে না)।
  • দ্বিতীয় আদেশটি হ'ল: s/#.*//। ইংরেজিতে, হ্যাশ চিহ্নের পরিবর্তে যতগুলি জিনিস আপনি দেখতে পান তারপরে (রেখার শেষ অবধি, এটি) কিছুই না দিয়ে (চূড়ান্ত দুটিয়ের মধ্যে ফাঁকা স্থান নয় //)।
  • সংক্ষেপে, এটি আপনার ফাইল মোছার লাইনগুলির মধ্য দিয়ে চলে যা সম্পূর্ণরূপে মন্তব্যগুলিতে এবং এর পরে যে কোনও লাইন থাকবে তার মধ্যে মন্তব্যগুলি আটকানো থাকবে।

1
এটি একটি স্ট্রিংয়ের ভিতরে হ্যাশের পরে পাওয়া কিছু মুছে ফেলবে , না? উদাহরণস্বরূপ mystring="Hello I am a #hash" হয়ে উঠবে mystring="Hello I am a"
জাভাদ্ব্বা

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

দুর্দান্ত উত্তর, সাধারণ ব্যবহারের ক্ষেত্রে বিস্তৃত অ্যারেগুলির জন্য এটি ইউটিলিটি বনাম জটিলতার দুর্দান্ত ব্যালেন্সের মতো দেখায়, তবে আপনি যদি আগেই জানেন যে আপনাকে কেবল #(কলাম 1 এ) দিয়ে সরাসরি লাইনগুলি মুছতে হবে , সেখানে কোনো সুবিধা sedবেশি grep -v "^#"?
RBF06

4

আপনি sed কমান্ড ব্যবহার করে প্রয়োজনীয় আউটপুট অর্জন করতে পারেন। নীচের কমান্ডটি আমার জন্য কৌশলটি করেছে।

sed 's/#.*$//g' FileName

কোথায়

  • #.*$- রেজিএক্সপ্যাক #লাইনের শেষ পর্যন্ত শুরু হওয়া সমস্ত স্ট্রিং ফিল্টার করবে

এখানে আমাদের সেই লাইনগুলি সরিয়ে ফেলতে হবে যাতে আমরা খালি তাই প্রতিস্থাপনের অংশটি এড়িয়ে চলেছি।

  • g - ফাইলের শেষ না হওয়া পর্যন্ত প্যাটার্নটির বারবার অনুসন্ধানের কথা উল্লেখ করা।

সিডের সাধারণ বাক্য গঠন: s/regexp/replacement/flags FileName


2
দ্রষ্টব্য: চতুর্থ লাইন এই ক্ষেত্রে নতুন লাইনের সাথে প্রতিস্থাপিত হয়েছে।
αғsнιη

1
সেই sedআদেশটি সহ কোনও স্ক্রিপ্ট দিয়ে চেষ্টা করুন ...
কুসালানন্দ

এটি হ্যান্ডেল করবে নাprint "#tag" # Print a hashtag.
রে বাটারওয়ার্থ

3

অন্যরা যেমন উল্লেখ করেছে, সেড এবং অন্যান্য পাঠ্য-ভিত্তিক সরঞ্জামগুলি যদি কোনও স্ক্রিপ্টের কোনও অংশ মতামত মতো লাগে তবে বাস্তবে তা না হয় তবে সেগুলি ভাল কাজ করবে না। উদাহরণস্বরূপ, আপনি একটি স্ট্রিংয়ের ভিতরে একটি # বা অন্যটি সাধারণ $#এবং খুঁজে পেতে পারেন ${#param}

আমি shfmt নামে একটি শেল ফর্ম্যাটর লিখেছি , এতে কোড ক্ষুদ্রায়নের বৈশিষ্ট্য রয়েছে। এর মধ্যে অন্যান্য বিষয়গুলির মধ্যে মন্তব্যগুলি অপসারণ অন্তর্ভুক্ত:

$ cat foo.sh
echo $# # inline comment
# lone comment
echo '# this is not a comment'
[mvdan@carbon:12] [0] [/home/mvdan]
$ shfmt -mn foo.sh
echo $#
echo '# this is not a comment'

পার্সার এবং প্রিন্টার হ'ল গো প্যাকেজ, সুতরাং যদি আপনি একটি কাস্টম সমাধান চান তবে আপনার পছন্দ মতো সঠিকভাবে মন্তব্যগুলি সরাতে 20-লাইন গো প্রোগ্রামটি লিখতে মোটামুটি সহজ হওয়া উচিত।


2

আপনি উল্টো ম্যাচটি এটির মতো ব্যবহার করতে পারেন:

    #grep -v "#" filename

-v, --invers-ম্যাচ অ-ম্যাচিং লাইনগুলি নির্বাচন করতে, মিলের অনুভূতিটি উল্টান। (-ভিটি পসিক্স দ্বারা নির্দিষ্ট করা হয়েছে))


2
@ আলিনহ উত্তরটি পর্যালোচনা করার জন্য ধন্যবাদ। দয়া করে মনে রাখবেন যে প্রশ্নটি কেবল রেখার শুরু নয় তবে ফাইলের যে কোনও জায়গায় প্রয়োজন। এটি উপরের প্রশ্নের তার প্রত্যাশিত ফলাফলটিও দেখায়। আমার উত্তরটি ভুল হবে যদি আমি কেবলমাত্র লাইনের শুরুটির সন্ধান করি।
রাজা

zzz। আমার খারাপ, শেষ লাইনটি
দেখেনি

1
এটি evenmorestuffওপির উদাহরণ দিয়ে শুরু করা লাইনটি পুরোপুরি সরিয়ে ফেলবে ।
জোসেফ আর।

@JosephR। ভালো বল ধরা. আমি এর আগে মিস করেছি। এই ক্ষেত্রে grep -o '^[^#]*' fileসেরা সমাধান হবে। এটি ইতিমধ্যে জিম্মিজ দ্বারা ব্যাখ্যা করা হয়েছে। আপনার পর্যালোচনার জন্য ধন্যবাদ
রাজা

এটি হ্যান্ডেল করবে নাprint "#tag" # Print a hashtag.
রে বাটারওয়ার্থ

2

আমি জোসেফের উত্তরটি পছন্দ করি তবে এটির // মন্তব্যগুলি সরিয়ে ফেলার দরকার পড়েছিল তাই আমি এটিকে কিছুটা সংশোধন করেছি এবং রেডহাতে পরীক্ষা করেছি

# no comments alias
alias nocom="sed -E '/^[[:blank:]]*(\/\/|#)/d;s/#.*//' | strings"

# example
cat SomeFile | nocom | less

আমি বাজি ধরছি স্ট্রিং ব্যবহারের চেয়ে ফাঁকা লাইনগুলি সরিয়ে ফেলার আরও ভাল উপায় তবে এটি আমার ব্যবহৃত দ্রুত এবং নোংরা সমাধান।

-cheers


এটি হ্যান্ডেল করবে নাprint "#tag" # Print a hashtag.
রে বাটারওয়ার্থ


1
cat YOUR_FILE | cut -d'#' -f1

এটি #কলাম বিভাজক হিসাবে ব্যবহার করে এবং কেবল প্রথম কলামটি রাখে (এটিই সব কিছু আগে #)।


1
যদি YOUR_FILEএই কমান্ডগুলি সমন্বিত কোনও স্ক্রিপ্ট হয় তবে স্ক্রিপ্টটি cat YOUR_FILE | cut -'সেই লাইনে থাকা ফাইলটিতে ছেড়ে যায়।
কুসালানন্দ

1

মত প্রকাশ করুন

egrep -v "#|$^" <file-name> 

: -v: উল্টো ম্যাচটি করবে

: #: # দিয়ে শুরু হওয়া সমস্ত লাইন মিলবে

: $ ^: সমস্ত ফাঁকা লাইনের সাথে মিলবে


1
না, #লাইনের যে কোনও জায়গায় মিলবে এবং পুরো লাইনটি সরিয়ে ফেলবে।
ইল্কাচ্চু

1

কমান্ডটি ব্যবহার করা সবচেয়ে ভাল সমাধান হবে:

sed -i.$(date +%F) '/^#/d;/^$/d' ntp.conf

-I হ'ল ইন-প্লেস এডিট তবে সরাসরি উপসর্গটি নীচে সিডকে একটি ব্যাকআপ তৈরি করতে বলে। এই ক্ষেত্রে তারিখ বর্ধনের সাথে (ntp.conf.date) আমরা একটি ঠিকানা স্পেস সহ প্রতিটি দুটি কমান্ড চালাচ্ছি, প্রথমটি মন্তব্য করা রেখাগুলি মুছে ফেলবে এবং দ্বিতীয়টি, খালি রেখাগুলি মুছে ফেলবে the

আমি এই সমাধানটি পেয়েছি: theurbanpenguin.com


0

অন্য কোনও উত্তর এই ন্যায়বিচারটি বলে মনে হচ্ছে না, তারা হয় ফাঁকা লাইনে ছেড়ে যায়, বা এমন লাইনে ছেড়ে যায় যেখানে মন্তব্যটি প্রথম অক্ষরে নেই। আমি এটি ব্যবহার করে শেষ করেছি:

cat << EOF >> ~/.bashrc
alias nocom='sed -e "/^\s*#/d" -e "/^\s*$/d"'
EOF

এটি একটি উপনাম সেট আপ করে, যাতে আপনাকে এটি মুখস্ত করতে হবে না (যা দিয়ে শুরু করা অসম্ভব)। একটি নতুন অধিবেশন খুলুন, এবং আপনার কাছে নতুন nocomকমান্ড থাকবে। তাহলে আপনি ঠিক করতে পারেন

nocom /etc/foobar.conf

চিয়ার্স।


1
.*$প্রথম রেজেক্সে ম্যাচ করার মতো খুব একটা পয়েন্ট নেই - অ্যাঙ্করটি কার্যকর নয় এবং আপনি কোনও প্রতিস্থাপনে ম্যাচযুক্ত টেক্সটটি ক্যাপচার করছেন না। ^\s*
জাস্ট

এটি হ্যান্ডেল করবে নাprint "#tag" # Print a hashtag.
রে বাটারওয়ার্থ


-1

আমি আমার জন্য কী কাজ করে তা পোস্ট করছি এবং অন্যদের কাছে ব্যাখ্যা করার পরে, ব্যাখ্যা সহ সর্বাধিক অর্থ বোধ করা হচ্ছে বলে মনে হচ্ছে। বেশ কয়েকটি পোস্ট ঘনিয়ে এলো, তবে আমি এখনও কোনও মন্তব্য করতে পারিনি (কারণ আমি একজন নবীন):

grep -E -v "(^#.*|^$)" filename
  • -E = নীচের প্যাটার্নটি নিয়মিত প্রকাশ হিসাবে উদাহরণস্বরূপ, যেমন egrep ব্যবহার করার মতো ব্যাখ্যা করুন
  • -v = প্যাটার্নের বিপরীতটি মুদ্রণ করুন (এক্সপ্রেশনটির সাথে মেলে না এমন লাইনগুলি মুদ্রণ করা হবে)
  • "(^#.*|^$)"= এটিতে একটি পাইপ রয়েছে যা একটি OR বিবৃতি নির্দিষ্ট করে। এই অভিব্যক্তিটি কোনও #(এবং এর পরে অন্য কিছু) দিয়ে শুরু হওয়া লাইন বা লাইনের শুরু এবং শেষের মধ্যে শূন্য অক্ষরযুক্ত কোনও রেখা মুদ্রণ করতে বলে ।

-vপর্দায় যে বিপর্যয়, যা অক্ষর সঙ্গে কোনো লাইন করে একটি শুরু হয় না হতে হবে প্রিন্ট হবে #


এটি হ্যান্ডেল করবে নাprint "#tag" # Print a hashtag.
রে বাটারওয়ার্থ

আহ, ঠিক আছে ... অবশ্যই যে ইশারা জন্য ধন্যবাদ। আমি টিপিক্যাল লিনাক্স কনফিগারেশন ফাইল যেমন পাম.ডি কনফিগারেশন সম্পর্কিত একটি উত্তর খুঁজছিলাম, তাই আমি এটি সম্পর্কে ভাবি নি। আমার ধারণা কোডের মতো একই লাইনে থাকা কোনও মন্তব্য খুঁজে পেতে এবং মুছে ফেলার জন্য এটি গ্রহণ করতে হবে। আমি উপরে আমার নির্দিষ্ট ইস্যুটির সম্ভবত আরও ভাল সমাধানটি দেখেছি: egrep -v "# | $ ^"
jackbmg
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.