আমি যখন বাশ (বা নির্দিষ্ট হতে wc -l < log.txt
) তে কমান্ডগুলি কার্যকর করি তখন আউটপুটটির পরে লাইন ব্রেক হয়। কিভাবে আমি তা পরিত্রাণ পেতে পারি?
আমি যখন বাশ (বা নির্দিষ্ট হতে wc -l < log.txt
) তে কমান্ডগুলি কার্যকর করি তখন আউটপুটটির পরে লাইন ব্রেক হয়। কিভাবে আমি তা পরিত্রাণ পেতে পারি?
উত্তর:
যদি আপনার প্রত্যাশিত আউটপুটটি একক লাইন হয় তবে আপনি আউটপুট থেকে সমস্ত নিউলাইন অক্ষর সরিয়ে ফেলতে পারেন। 'টিআর' ইউটিলিটিতে পাইপ দেওয়া বা পছন্দ হলে পার্লের কাছে অস্বাভাবিক হবে না:
wc -l < log.txt | tr -d '\n'
wc -l < log.txt | perl -pe 'chomp'
ট্রেলিং করা নতুন লাইনটি সরাতে আপনি কমান্ড বিকল্প ব্যবহার করতে পারেন:
echo -n "$(wc -l < log.txt)"
printf "%s" "$(wc -l < log.txt)"
দয়া করে নোট করুন যে আমি গৃহীত উত্তরটি বেছে নেওয়ার ওপির সিদ্ধান্তের সাথে একমত নই। আমি বিশ্বাস করি যেখানে সম্ভব সেখানে 'জার্গার্স' ব্যবহার করা এড়ানো উচিত। হ্যাঁ, এটি একটি দুর্দান্ত খেলনা। না, আপনার এখানে দরকার নেই।
যদি আপনার প্রত্যাশিত আউটপুটে একাধিক লাইন থাকতে পারে তবে আপনার আরও একটি সিদ্ধান্ত নেওয়া উচিত:
আপনি যদি ফাইলটির শেষে থেকে একাধিক নিউলাইন অক্ষরগুলি মুছতে চান তবে আবার cmd প্রতিস্থাপন ব্যবহার করুন:
printf "%s" "$(< log.txt)"
আপনি যদি কোনও ফাইল থেকে শেষের নতুন লাইনের চরিত্রটি কঠোরভাবে মুছে ফেলতে চান তবে পার্ল ব্যবহার করুন:
perl -pe 'chomp if eof' log.txt
মনে রাখবেন যে আপনি যদি নিশ্চিত হন যে আপনি মুছে ফেলতে চান এমন একটি অনুচর নতুন লাইনের চরিত্র রয়েছে তবে আপনি শেষ বাইট বাদে সমস্ত কিছু নির্বাচন করতে GNU কোর্টিল থেকে 'হেড' ব্যবহার করতে পারেন। এটি বেশ দ্রুত হওয়া উচিত:
head -c -1 log.txt
এছাড়াও, সম্পূর্ণতার জন্য, আপনি দ্রুত 'বিড়াল' এবং 'শো-অল' পতাকা ব্যবহার করে আপনার ফাইলে আপনার নতুন লাইন (বা অন্যান্য বিশেষ) অক্ষরগুলি কোথায় তা পরীক্ষা করে দেখতে পারেন। ডলারের চিহ্ন চিহ্নটি প্রতিটি লাইনের সমাপ্তি নির্দেশ করবে:
cat -A log.txt
tr --delete '\n'
।
| tr -d '\r'
একমুখী:
wc -l < log.txt | xargs echo -n
echo -n `wc -l log.txt`
IFS
) একটি স্থানের মধ্যে চেপে ফেলবে । উদাহরণ echo "a b" | xargs echo -n
:; echo -n $(echo "a b")
। এটি ব্যবহারের ক্ষেত্রে সমস্যা হতে পারে বা নাও হতে পারে।
-e
, তবে এটি বিকল্প হিসাবে ব্যাখ্যা করা হবে echo
। এটি ব্যবহার করা সর্বদা নিরাপদ printf '%s'
।
xargs
আমার সিস্টেমে খুব ধীর গতির (এবং আমি সন্দেহ করি এটি অন্যান্য সিস্টেমেও রয়েছে), তাই printf '%s' $(wc -l log.txt)
এটি দ্রুততর হতে পারে, যেহেতু printf
সাধারণত একটি বিল্টিন (কোনও তথ্য পুনর্নির্দেশ না থাকায়)। কখনই ব্যাকটিকগুলি ব্যবহার করবেন না, এগুলিকে আরও নতুন পসিক্স সংস্করণে ছাড় দেওয়া হয়েছে এবং তাদের অনেকগুলি ত্রুটি রয়েছে।
বাশ ভেরিয়েবল প্রতিস্থাপনে সাদা স্থান অপসারণের জন্য সরাসরি সমর্থন রয়েছে :
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
trailing_linebreak_removed=${testvar%?}
যদি আপনি এর আউটপুটটি একটি ভেরিয়েবলের জন্য বরাদ্দ করেন তবে bash
স্বয়ংক্রিয়ভাবে হোয়াইটস্পেস স্ট্রিপগুলি:
linecount=`wc -l < log.txt`
প্রিন্টফ ইতিমধ্যে আপনার জন্য পেছনের নতুন লাইনটি কাটাচ্ছে:
$ printf '%s' $(wc -l < log.txt)
বিস্তারিত:
%s
স্ট্রিং প্লেস ধারকের জায়গায় আপনার সামগ্রী মুদ্রণ করবে । %s\n
) মুদ্রণ করতে না বলেন, এটি হবে না।"$(command)"
তবে অভ্যন্তরীণ নতুনলাইনগুলি সংরক্ষণ করা হবে - এবং কেবলমাত্র অনুবর্তনযোগ্য নতুন লাইনটি সরানো হবে। শেলটি এখানে সমস্ত কাজ করছে - printf
কমান্ড প্রতিস্থাপনের ফলাফলগুলিতে ফিরে যাওয়ার একমাত্র উপায় stdout
।
$( )
নির্মাণের সাথে এটি করছে । এখানে প্রমাণ আছে:printf "%s" "$(perl -e 'print "\n"')"
$ printf '%s' "$(wc -l < log.txt)"
আপনি যদি কেবলমাত্র সর্বশেষ নিউলাইনটি সরাতে চান তবে এর মাধ্যমে পাইপ করুন:
sed -z '$ s/\n$//'
sed
\0
প্রবাহকারীর NUL
মাধ্যমে সেট করা থাকলে স্ট্রিমের শেষের শেষে একটি যুক্ত করবে না -z
, যেখানে একটি পসিক্স পাঠ্য ফাইল তৈরি করতে (একটিতে সংজ্ঞায়িত \n
), এটি সর্বদা \n
ছাড়াই একটি ফাইনাল আউটপুট করবে -z
।
উদাহরণ:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender
এবং কোন NUL
যোগ প্রমাণিত :
$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72 foo.bar
করার একাধিক চিহ্ন নতুন লাইন অপসারণ , নল মাধ্যমে:
sed -Ez '$ s/\n+$//'
sed
করে না -z
।
আপনি যদি লাইনের শেষ না করে কোনও কিছুর আউটপুট মুদ্রণ করতে চান, আপনি এটি -n
স্যুইচ দিয়ে প্রতিধ্বনি করুন ।
আপনার যদি এটি ইতিমধ্যে কোনও ভেরিয়েবলে থাকে তবে তারপরে এটি ট্র্যাকিং নতুন লাইনের সাথে প্রতিধ্বনিত করুন :
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
অথবা আপনি এটির পরিবর্তে এক লাইনে এটি করতে পারেন:
$ echo -n $(wc -l < log.txt)
echo -n $(wc -l < log.txt)
একই প্রভাব আছে।