বাশ: স্ট্রিপ আউটপুট থেকে লাইন ব্রেক ব্রেক


187

আমি যখন বাশ (বা নির্দিষ্ট হতে wc -l < log.txt) তে কমান্ডগুলি কার্যকর করি তখন আউটপুটটির পরে লাইন ব্রেক হয়। কিভাবে আমি তা পরিত্রাণ পেতে পারি?

উত্তর:


249

যদি আপনার প্রত্যাশিত আউটপুটটি একক লাইন হয় তবে আপনি আউটপুট থেকে সমস্ত নিউলাইন অক্ষর সরিয়ে ফেলতে পারেন। 'টিআর' ইউটিলিটিতে পাইপ দেওয়া বা পছন্দ হলে পার্লের কাছে অস্বাভাবিক হবে না:

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

এটি আউটপুট থেকে সমস্ত নতুনলাইনগুলি সরিয়ে দেয়, শিরোনামটি যেমন জিজ্ঞাসা করে তেমনি পিছনে থাকা নতুন লাইনও নয়।
কোডি এ। রে

@ কোডা.আর: আপনাকে অবশ্যই একমত হতে হবে, যে প্রশ্নটি একটি নির্দিষ্ট কমান্ডকে বর্ণনা করে যা কেবলমাত্র একক আউটপুট তৈরি করে। তবে আমি আরও সাধারণ ক্ষেত্রে অনুসারে আমার উত্তর আপডেট করেছি। আছে HTH।
স্টিভ

3
সংক্ষিপ্ত বিকল্পগুলি দীর্ঘ বিকল্পগুলির সাথে প্রতিস্থাপন করা থাকলে এটি আরও ভাল। দীর্ঘ বিকল্পগুলি যেমন ফাংশন যেমন শেখায় tr --delete '\n'
এলিজা লিন

1
আমিও করেছি| tr -d '\r'
AlikElzin-kilaka

এটি লক্ষণীয় যে ফাইলটি খুব বড় হলে সেমিডি প্রতিস্থাপনের সমাধানটি একটি দীর্ঘমেয়াদীরেখা নিয়ে যেতে পারে।
পিএইচকে

88

একমুখী:

wc -l < log.txt | xargs echo -n

24
আরও ভাল:echo -n `wc -l log.txt`
সত্য

9
পাইপ ব্যবহারের চেয়ে কেন ব্যাকটিক্সে কমান্ড কার্যকর করা ভাল?
ম্যাথু শিনকেল

2
এগুলি কেবল চলমান নিউলাইনগুলি সরিয়ে ফেলবে না, তবে কোনও স্থানে থাকা কোনও ক্রমাগত শ্বেতস্পেসগুলি (আরও সুনির্দিষ্টভাবে, সংজ্ঞায়িত হিসাবে IFS) একটি স্থানের মধ্যে চেপে ফেলবে । উদাহরণ echo "a b" | xargs echo -n:; echo -n $(echo "a b")। এটি ব্যবহারের ক্ষেত্রে সমস্যা হতে পারে বা নাও হতে পারে।
ম্যাসিফিল

14
সবচেয়ে খারাপ, যদি আউটপুটটি শুরু হয় -e, তবে এটি বিকল্প হিসাবে ব্যাখ্যা করা হবে echo। এটি ব্যবহার করা সর্বদা নিরাপদ printf '%s'
musifhil

1
xargsআমার সিস্টেমে খুব ধীর গতির (এবং আমি সন্দেহ করি এটি অন্যান্য সিস্টেমেও রয়েছে), তাই printf '%s' $(wc -l log.txt)এটি দ্রুততর হতে পারে, যেহেতু printfসাধারণত একটি বিল্টিন (কোনও তথ্য পুনর্নির্দেশ না থাকায়)। কখনই ব্যাকটিকগুলি ব্যবহার করবেন না, এগুলিকে আরও নতুন পসিক্স সংস্করণে ছাড় দেওয়া হয়েছে এবং তাদের অনেকগুলি ত্রুটি রয়েছে।
yyny

13

বাশ ভেরিয়েবল প্রতিস্থাপনে সাদা স্থান অপসারণের জন্য সরাসরি সমর্থন রয়েছে :

testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}

1
আপনি এটিও ব্যবহার করতে পারেনtrailing_linebreak_removed=${testvar%?}
পেয়ার্ডপ্রোটোটাইপ

মনে রাখবেন যে আপনি যদি কমান্ড সাবস্টিটিউশন ব্যবহার করছেন তবে আপনাকে নতুন লেলাইনগুলি সরিয়ে ফেলতে কিছু করার দরকার নেই। কমান্ড প্রতিস্থাপনের অংশ হিসাবে বাশ ইতিমধ্যে এটি করেছে: gnu.org/software/bash/manual/html_node/…
মাইকেল বুড়

10

যদি আপনি এর আউটপুটটি একটি ভেরিয়েবলের জন্য বরাদ্দ করেন তবে bashস্বয়ংক্রিয়ভাবে হোয়াইটস্পেস স্ট্রিপগুলি:

linecount=`wc -l < log.txt`

10
ট্রেলিং নিউলাইনগুলি হ্রাস করা হয়, সঠিক হতে। এটি কমান্ড প্রতিস্থাপন যা এগুলি সরিয়ে দেয়, ভেরিয়েবল অ্যাসাইনমেন্টটি নয়।
চিপনার

2
আমি সাইগউইন বাশে দেখেছি $ (সেন্টিমিটার / সি প্রতিধ্বনি% VAR%) ব্যবহার করার সময় পেছনের সাদা স্থানটি সরানো হয়নি। এই ক্ষেত্রে আমাকে I've {var %% [[:: স্থান:]] use ব্যবহার করতে হয়েছিল}
আন্দ্রে তারানভ

1
দ্রষ্টব্য: এটি ভেরিয়েবল অ্যাসাইনমেন্ট নয়, তবে এক্সপ্রেশন এক্সপেনশন যা নিউলাইনগুলি সরিয়ে দেয়।
সিওরো সান্তিলি 法轮功 冠状 病 六四 事件

10

প্রিন্টফ ইতিমধ্যে আপনার জন্য পেছনের নতুন লাইনটি কাটাচ্ছে:

$ printf '%s' $(wc -l < log.txt)

বিস্তারিত:

  • প্রিন্টফ %sস্ট্রিং প্লেস ধারকের জায়গায় আপনার সামগ্রী মুদ্রণ করবে ।
  • আপনি যদি এটি একটি নতুন লাইন ( %s\n) মুদ্রণ করতে না বলেন, এটি হবে না।

7
আপনি যদি কমান্ডের চারপাশে ডাবল উদ্ধৃতি স্থাপন করেন "$(command)"তবে অভ্যন্তরীণ নতুনলাইনগুলি সংরক্ষণ করা হবে - এবং কেবলমাত্র অনুবর্তনযোগ্য নতুন লাইনটি সরানো হবে। শেলটি এখানে সমস্ত কাজ করছে - printfকমান্ড প্রতিস্থাপনের ফলাফলগুলিতে ফিরে যাওয়ার একমাত্র উপায় stdout
নোবর

2
এটি প্রিন্টফ নয় যে এখানে নতুন লাইনটি কেটে ফেলছে, এটি শেল যা এটি $( )নির্মাণের সাথে এটি করছে । এখানে প্রমাণ আছে:printf "%s" "$(perl -e 'print "\n"')"
Flimm

আবার, এটি লক্ষণীয় যে ফলস্বরূপ কমান্ড লাইনটি খুব দীর্ঘ হতে পারে।
পিএইচকে

এটি @ নোবারের পরামর্শ সহ একটি সুবিধাজনক সমাধান:$ printf '%s' "$(wc -l < log.txt)"
ইলিয়াস করিম

8

আপনি যদি কেবলমাত্র সর্বশেষ নিউলাইনটি সরাতে চান তবে এর মাধ্যমে পাইপ করুন:

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
স্পাইডি

5

আপনি যদি লাইনের শেষ না করে কোনও কিছুর আউটপুট মুদ্রণ করতে চান, আপনি এটি -nস্যুইচ দিয়ে প্রতিধ্বনি করুন ।

আপনার যদি এটি ইতিমধ্যে কোনও ভেরিয়েবলে থাকে তবে তারপরে এটি ট্র্যাকিং নতুন লাইনের সাথে প্রতিধ্বনিত করুন :

    $ testvar=$(wc -l < log.txt)
    $ echo -n $testvar

অথবা আপনি এটির পরিবর্তে এক লাইনে এটি করতে পারেন:

    $ echo -n $(wc -l < log.txt)

2
পরিবর্তনশীলটি প্রযুক্তিগতভাবে অপ্রয়োজনীয়। echo -n $(wc -l < log.txt)একই প্রভাব আছে।
চিপনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.