আমি সেড ব্যবহার করে কীভাবে একটি নতুন লাইন () n) প্রতিস্থাপন করতে পারি?


1370

কমান্ডটি ব্যবহার করে আমি কীভাবে একটি নতুন লাইন (" \n") একটি স্থান (" ") দিয়ে প্রতিস্থাপন করতে পারি sed?

আমি ব্যর্থ চেষ্টা করেছি:

sed 's#\n# #g' file
sed 's#^$# #g' file

আমি কীভাবে এটি ঠিক করব?


27
trকাজের জন্য কেবল সঠিক হাতিয়ার যদি কোনও একক চরিত্রের জন্য একটি একক চরিত্রের প্রতিস্থাপন করা হয়, যখন উপরের উদাহরণগুলি শুরুর সাথে একটি নতুন স্থানকে একটি স্থানের সাথে প্রতিস্থাপন করে .. সুতরাং উপরের উদাহরণে, টিআর কাজ করতে পারে .. তবে পরে এটি সীমাবদ্ধ থাকবে।
ক্রোধে 84

9
trকাজের সঠিক উপায়ে কারণ প্রশ্নকর্তা প্রতিটি উদাহরণটিকে একটি স্থান দিয়ে প্রতিস্থাপন করতে চেয়েছিলেন, যেমন তার উদাহরণে দেখানো হয়েছে। নিউলাইনগুলি প্রতিস্থাপনের জন্য অনন্যরূপে তীরযুক্ত sedতবে এটি সহজেই হয়ে যায় tr। এটি একটি সাধারণ প্রশ্ন। রেজেক্স রিপ্লেসমেন্টগুলি সম্পাদন করা trকিন্তু দ্বারা করা হয় না sed, যা সঠিক প্রশ্নের জন্য হবে ... অন্য প্রশ্নের জন্য।
মাইক এস

3
"টিআর" কেবল নতুন লাইনটি মুছে ফেলতে পারে `ট্র-ডি '\ n'` তবে আপনি আরও সার্বজনীন `ট্র-ডি '\ 012 \ 015'` হতে রিটার্ন মুছতে পছন্দ করতে পারেন `
এন্থনি

2
সতর্কতা: "টিআর" লিনাক্স এবং পুরানো সোলারিস মেশিনের (EG sol5.8) এর মধ্যে একটি চরিত্রের ক্ষেত্রে ভিন্নভাবে কাজ করে। EG: `tr -d 'az'` এবং `tr -d '[আজ]'` ` তার জন্য আমি আপনাকে "সেড" ব্যবহার করার পরামর্শ দিচ্ছি যা এর মধ্যে তফাত নেই।
এন্থনি

2
@ মাইকেস উত্তরের জন্য ধন্যবাদ। tr '\012' ' 'একটি সঙ্গে অনুসরণ করুন echo। অন্যথায় ফাইলের শেষ লাইনফিডটিও মুছে ফেলা হয়। tr '\012' ' ' < filename; echoকৌতুক করে
বার্নি রিটার

উত্তর:


1513

জিএনইউ দিয়ে এই সমাধানটি ব্যবহার করুন sed:

sed ':a;N;$!ba;s/\n/ /g' file

এটি একটি লুপে পুরো ফাইলটি পড়বে, তারপরে নতুন লাইনের স্থানগুলিকে একটি স্থানের সাথে প্রতিস্থাপন করবে।

ব্যাখ্যা:

  1. এর মাধ্যমে একটি লেবেল তৈরি করুন :a
  2. মাধ্যমে প্যাটার্ন স্পেসে বর্তমান এবং পরবর্তী লাইন যুক্ত করুন N
  3. যদি আমরা শেষ লাইনের আগে, তৈরি লেবেলে শাখা করি $!ba(এর $!অর্থ শেষ লাইনে এটি না করা কারণ একটি চূড়ান্ত নতুন লাইন থাকা উচিত)।
  4. অবশেষে প্রতিস্থাপনটি প্রতিটি নিউলাইনকে প্যাটার্ন স্পেসের (যা পুরো ফাইলটি) স্থান দিয়ে প্রতিস্থাপিত করে।

এখানে ক্রস প্ল্যাটফর্ম সামঞ্জস্যপূর্ণ বাক্য গঠন যা বিএসডি এবং ওএস এক্স এর সাথে কাজ করে sed( @ বেঞ্জির মন্তব্য অনুসারে ):

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file

আপনি দেখতে পাচ্ছেন, sedঅন্যথায় এর জন্য ব্যবহার করা সহজ সমস্যা। একটি সহজ এবং পর্যাপ্ত সমাধানের জন্য এই উত্তরটি দেখুন


45
@ আরজান এবং মাসি: ওএস এক্স জিএনইউয়ের sedপরিবর্তে বিএসডি ব্যবহার করেছে sed, সুতরাং এই দুজনের মধ্যে কিছু সূক্ষ্ম (এবং কিছু এত সূক্ষ্ম নয়) পার্থক্যও থাকতে পারে। যদি আপনি উভয় ওএস এক্স এবং * নিক্স মেশিনে কাজ করেন তবে এটি একটি স্থির ব্যথা। আমি সাধারণত জিএনইউ coreutilsএবং findutilsওএস এক্স এ ইনস্টল করি এবং বিএসডি সংস্করণ উপেক্ষা করি।
টেলিমাচাস

50
:a, একটি রেজিস্টার নয় এটি একটি শাখা লেবেল। এটি bকমান্ড * এর লক্ষ্য যা "গোটো" এর মতো কাজ করে। এটিকে একটি রেজিস্টার বলার অর্থ হ'ল আপনি সঞ্চয় স্থান তৈরি করতে পারেন। এখানে মাত্র দুটি "রেজিস্ট্রার" রয়েছে; একটিকে "হোল্ড স্পেস" বলা হয় যা আপনার স্ক্রিপ্ট ব্যবহার করছে না এবং অন্যটিকে "প্যাটার্ন স্পেস" বলা হয়। Nকমান্ড একটি newline এবং প্যাটার্ন স্থান থেকে ইনপুট ফাইল এর পরের লাইন appends। [* আপনার একাধিক লেবেল এবং bকমান্ড থাকতে পারে। আপনার যদি এতে bকোনও লেবেল চার্ট যুক্ত কোনও কমান্ড থাকে তবে এটি পরবর্তী লাইনটি পড়তে আবার
স্ক্র্যাপের

108
আপনি এই ক্রস-প্ল্যাটফর্মটি চালাতে পারেন (অর্থাত ম্যাক ওএস এক্সে) আধা-কলোন দিয়ে পৃথক না হয়ে পৃথকভাবে আদেশগুলি প্রয়োগ করে: sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'
বেনজি

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

12
লোকেরা আসুন - একটি পাগল, অজানা সমাধানের জন্য 261 টি আপভোট যা কার্যকর হয় না ???? সিড একটি একক লাইনে সাধারণ সাবস্ক্রিপশনগুলির জন্য একটি দুর্দান্ত সরঞ্জাম, অন্য যে কোনও কিছুর জন্য কেবল বিশ্রী ব্যবহার করুন। শুভ শোক ....
এড মর্টন

1711

sedলাইন ভিত্তিক ইনপুট ব্যবহার করার উদ্দেশ্যে। যদিও এটি আপনার যা প্রয়োজন তা করতে পারে।


trকমান্ডটি নিম্নরূপ ব্যবহার করা এখানে আরও ভাল বিকল্প :

tr '\n' ' ' < input_filename

বা সম্পূর্ণরূপে নিউলাইন চরিত্রগুলি মুছে ফেলুন:

tr -d '\n' < input.txt > output.txt

বা আপনার যদি জিএনইউ সংস্করণ থাকে (এর দীর্ঘ বিকল্পগুলির সাথে)

tr --delete '\n' < input.txt > output.txt

88
শেড লাইন-ভিত্তিক তাই নিউলাইনগুলি ধরা এটির পক্ষে শক্ত।
আলেকজান্ডার গ্ল্যাডিশ

191
সেড ইনপুটটির একটি "স্ট্রিম" এ কাজ করে তবে এটি এটি নতুন লাইনের সীমানাযুক্ত অংশগুলিতে উপলব্ধি করে। এটি একটি ইউনিক্স সরঞ্জাম, যার অর্থ এটি খুব ভালভাবে একটি কাজ করে। একটি জিনিস হ'ল "একটি ফাইল লাইন-ভিত্তিক কাজ"। এটিকে অন্য কিছু করা শক্ত হবে এবং বগী হওয়ার ঝুঁকি রয়েছে। গল্পটির নৈতিকতা হল: সঠিক সরঞ্জামটি চয়ন করুন। আপনার বেশিরভাগ প্রশ্নের মধ্যে এই রূপটি মনে হচ্ছে "আমি কীভাবে এই সরঞ্জামটি এমন কিছু করতে পারি যা এর আগে কখনও করা হয়নি?" এই প্রশ্নগুলি আকর্ষণীয়, তবে যদি তারা একটি আসল সমস্যা সমাধানের পথে আসে তবে আপনি সম্ভবত এটি ভুল করছেন।
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

7
trপাইপলাইন নির্মাণের জন্য @ জেবিব্রাউন একটি অবহেলিত রত্ন।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

70
টিআরআর দুর্দান্ত, তবে আপনি কেবলমাত্র একক অক্ষর দিয়ে নতুনলাইনগুলি প্রতিস্থাপন করতে পারেন। আপনি যদি একটি স্ট্রিং দিয়ে নতুনলাইনগুলি প্রতিস্থাপন করতে চান তবে আপনাকে একটি আলাদা সরঞ্জাম ব্যবহার করতে হবে
এডি

21
@ এডি - আমি পাঠ্যটিতে উপস্থিত না হওয়া একটি অক্ষরের সাথে নতুন রেখাগুলি প্রতিস্থাপন করতে ট্র ব্যবহার করেছি (আমি ব্যাকটিক ব্যবহার করেছি), তারপরে আমি যে স্ট্রিংটি ব্যবহার করতে চাইছিলাম তার সাথে ব্যাকটিকটি প্রতিস্থাপন করতে
পেরেছিলাম

493

দ্রুত উত্তর

sed ':a;N;$!ba;s/\n/ /g' file
  1. : একটি 'একটি' লেবেল তৈরি
  2. প্যাটার্ন স্পেসে পরবর্তী পংক্তিতে এন যুক্ত করুন
  3. $! না শেষ লাইনটি যদি , বিএ শাখা ট্যাগ 'একটি' (যান)
  4. এর বিকল্প , / \ n / নতুন লাইনের জন্য রেইগেক্স , / / একটি স্পেস দ্বারা , / জি গ্লোবাল ম্যাচ (যতবার সম্ভব)

সেডটি শেষ লাইনে পৌঁছানো পর্যন্ত 1 থেকে 3 ধাপে লুপ করবে, সমস্ত রেখাকে প্যাটার্ন স্পেসে ফিট করে যেখানে সেড সমস্ত characters n অক্ষরকে প্রতিস্থাপন করবে


বিকল্প

প্রক্রিয়া শুরু করার জন্য শেডের বিপরীতে সমস্ত বিকল্পের শেষ লাইনে পৌঁছানোর প্রয়োজন হবে না

সঙ্গে ব্যাশ , ধীর

while read line; do printf "%s" "$line "; done < file

সঙ্গে Perl , sed -একটি গতি

perl -p -e 's/\n/ /' file

সঙ্গে TR , দ্রুত চেয়ে sed , এক অক্ষর দ্বারা প্রতিস্থাপন করতে পারেন শুধুমাত্র

tr '\n' ' ' < file

সঙ্গে পেস্ট , TR -একটি গতি, একটি অক্ষর দ্বারা প্রতিস্থাপন করতে পারেন শুধুমাত্র

paste -s -d ' ' file

সঙ্গে awk , TR -একটি গতি

awk 1 ORS=' ' file

"ইকো $ (<ফাইল)" এর মতো অন্যান্য বিকল্প ধীর গতিতে কেবল ছোট ফাইলগুলিতে কাজ করে এবং প্রক্রিয়া শুরু করতে পুরো ফাইলটি প্রক্রিয়া করা প্রয়োজন।


সেড এফএকিউ 5.10 থেকে দীর্ঘ উত্তর

5.10। আমি কেন escape n অব্যাহতি
ক্রমটি ব্যবহার করে একটি নতুন লাইন মিলিয়ে বা মুছতে পারি না ? আমি কেন or n ব্যবহার করে 2 বা ততোধিক লাইন মিলাতে পারি না?

Line n কখনই লাইনের শেষে লাইনের সাথে মিলবে না কারণ
লাইনটি
প্যাটার্ন স্পেসে রাখার আগেই নতুন লাইনটি সর্বদা ছিটকে যায় stri প্যাটার্ন স্পেসে 2 বা ততোধিক লাইন পেতে,
'এন' কমান্ড বা অনুরূপ কিছু ব্যবহার করুন (যেমন 'এইচ; ...; জি;')।

শেড এর মতো কাজ করে: সেড একবারে একটি লাইন পড়ে,
সমাপ্তি নিউলাইনটি বন্ধ করে দেয়, যা প্যাটার্ন স্পেসে রেখে যায়
সেটিকে যেখানে সেড স্ক্রিপ্টটি সম্বোধন করতে বা পরিবর্তন করতে পারে, এবং যখন প্যাটার্ন স্পেসটি
মুদ্রিত হয়, তখন স্টডআউটে একটি নতুন লাইন যুক্ত হয় (বা একটি ফাইলে) যদি
প্যাটার্ন স্পেসটি পুরোপুরি বা আংশিকভাবে 'd' বা 'ডি' দিয়ে মুছে ফেলা হয় তবে এ জাতীয় ক্ষেত্রে
নিউলাইন যুক্ত করা হয় না । সুতরাং, স্ক্রিপ্ট পছন্দ

  sed 's/\n//' file       # to delete newlines from each line             
  sed 's/\n/foo\n/' file  # to add a word to the end of each line         

কখনও কাজ করবে না, কারণ লাইনটি প্যাটার্ন স্পেসে রাখার আগেই অনুসরণ করা নিউলাইনটি সরানো হবে
। উপরের কাজগুলি সম্পাদন করতে,
পরিবর্তে এই স্ক্রিপ্টগুলির মধ্যে একটি ব্যবহার করুন:

  tr -d '\n' < file              # use tr to delete newlines              
  sed ':a;N;$!ba;s/\n//g' file   # GNU sed to delete newlines             
  sed 's/$/ foo/' file           # add "foo" to end of each line          

যেহেতু GNU সেড ব্যতীত সেডের অন্যান্য সংস্করণগুলির
প্যাটার্ন বাফারের আকারের সীমা রয়েছে , তাই ইউনিক্স 'টিআর' ইউটিলিটিটি এখানে অগ্রাধিকার দেওয়া উচিত।
যদি ফাইলের শেষ লাইনে একটি নতুন লাইন থাকে তবে জিএনইউ সেড
সেই আউটপুটটিতে সেই নতুন লাইন যুক্ত করবে তবে অন্য সমস্ত মুছে ফেলবে, অন্যদিকে টিআর সমস্ত নতুনলাইন
মুছে ফেলবে।

দুটি বা ততোধিক লাইনের ব্লকের সাথে মিল রাখতে, এখানে 3 টি প্রাথমিক পছন্দ রয়েছে:
(1) প্যাটার্ন স্পেসে নেক্সট লাইন যুক্ত করতে 'এন' কমান্ডটি ব্যবহার করুন;
(২)
হোল্ড স্পেসে বর্তমান লাইনটি যুক্ত করতে কমপক্ষে দুবার 'এইচ' কমান্ডটি ব্যবহার করুন , এবং তারপরে হোল্ড স্পেস থেকে
এক্স, জি, বা জি দিয়ে লাইনগুলি পুনরুদ্ধার করুন ; অথবা (3)
দুটি নির্দিষ্ট ঠিকানার মধ্যে লাইন মেলে অ্যাড্রেস রেঞ্জগুলি (উপরের অংশ 3.3 দেখুন) ব্যবহার করুন ।

পছন্দগুলি (1) এবং (2) প্যাটার্ন স্পেসে একটি put n স্থাপন করবে, যেখানে এটি
পছন্দসই হিসাবে সম্বোধন করা যেতে পারে ('s / ABC \ nXYZ / বর্ণমালা / ছ')।
লাইনের একটি ব্লক মুছে ফেলার জন্য 'এন' ব্যবহারের একটি উদাহরণ বিভাগে প্রকাশিত হয়েছে 4.13
("আমি কীভাবে নির্দিষ্ট ধারাবাহিক লাইনের একটি ব্লক মুছব?")।
মুছা কমান্ডকে
'পি' (মুদ্রণ), 'আই' (সন্নিবেশ), 'সি' (পরিবর্তন), 'এ' (সংযোজন),
বা 'এস' (বিকল্প) এর মতো মুছুন আদেশটি অন্য কোনও কিছুতে পরিবর্তন করে এই উদাহরণটি পরিবর্তন করা যেতে পারে can ।

পছন্দ (3) প্যাটার্ন স্পেসে কোনও \ n রাখবে না, তবে এটি ধারাবাহিক লাইনের একটি ব্লকের সাথে
মেলে, তাই এটি
এমনও হতে পারে যে আপনি যা সন্ধান করছেন তা সন্ধান করার জন্য আপনার এমনকি need n এরও প্রয়োজন নেই। যেহেতু GNU
সেড সংস্করণ 3.02.80 এখন এই বাক্য গঠনটিকে সমর্থন করে:

  sed '/start/,+4d'  # to delete "start" plus the next 4 lines,           

/তিহ্যবাহী '/ এখান থেকে /, / সেখানে / {...}' ব্যাপ্তি
ঠিকানাগুলি ছাড়াও পুরোপুরি \ n এর ব্যবহার এড়ানো সম্ভব হতে পারে।


6
trএকটি দুর্দান্ত ধারণা ছিল এবং আপনার সামগ্রিক কভারেজটি একটি উচ্চ-মানের জবাব দেয়।
নিউ আলেকজান্দ্রিয়া

1
( স্ট্যান্ডার্ড ইউটিলিটি ) ব্যবহারের জন্য +1 paste... এবং অন্যান্য সমস্ত!
টোটার


4
এই উত্তরটির সর্বোত্তম অংশটি হ'ল "দীর্ঘ উত্তর" হ'ল আদেশটি কীভাবে এবং কেন কাজ করে ঠিক তা ব্যাখ্যা করে।
পিডওয়াকার

3
আমি স্ট্যাকেক্সচেঞ্জে যে হাজার হাজার উত্তর পড়েছি তার মধ্যে এটি সবচেয়ে সহায়ক হতে পারে। লাইন জুড়ে আমার একাধিক অক্ষর মেলে নেওয়া দরকার। পূর্বের কোনও সিড উদাহরণগুলি মাল্টি-লাইনগুলি কভার করে না এবং টিআর একাধিক অক্ষরের মিলটি পরিচালনা করতে পারে না। পার্ল দেখতে দেখতে ভাল লাগছে, তবে আমি যেমন আশা করি তেমন কাজ করে না। যদি আমি পারতাম তবে এই উত্তরটি বেশ কয়েকবার ভোট দিয়েছি।
পাওয়ারপাইল

225

একটি সংক্ষিপ্ত আকারের বিকল্প:

awk 1 ORS=' '

ব্যাখ্যা

শর্তসাপেক্ষ কোড-ব্লক সমন্বিত একটি বিভক্ত প্রোগ্রামটি এমন বিধি দ্বারা গঠিত যা অর্থাত:

condition { code-block }

কোড-ব্লক বাদ দেওয়া হয়, ডিফল্ট ব্যবহার করা হয়: { print $0 }। সুতরাং, এটি 1একটি সত্য শর্ত হিসাবে ব্যাখ্যা করা print $0হয় এবং প্রতিটি লাইনের জন্য কার্যকর করা হয়।

যখন awkইনপুট এটা splits মান উপর ভিত্তি করে রেকর্ড মধ্যে সার্চ RS(রেকর্ড পৃথককারী), যা ডিফল্টভাবে একটি newline হয়, এইভাবে awkহবে ডিফল্ট ইনপুট পার্স করে সীমারেখা প্রজ্ঞাময়। বিভাজক RSইনপুট রেকর্ড থেকে সরে যাওয়া জড়িত ।

এখন, কোনও রেকর্ড মুদ্রণের সময়, ORS(আউটপুট রেকর্ড পৃথককারী) এতে যুক্ত করা হয়, ডিফল্ট আবার একটি নতুন লাইন। সুতরাং ORSএকটি স্পেসে পরিবর্তন করে সমস্ত নতুন লাইনের স্থানগুলিতে পরিবর্তন করা হয়।


5
আমি এই সহজ সমাধানটি অনেক পছন্দ করি যা অন্যের চেয়ে অনেক বেশি পঠনযোগ্য
ফেদির আরওয়াইকিটিক

8
যদি এটি আরও অর্থবোধ করে, তবে কার্যকরভাবে এটি লিখিত হতে পারে: awk 'BEGIN { ORS=" " } { print $0 } END { print "\n"} ' file.txt(শুরু / শেষ চিত্রিত করার জন্য একটি শেষ নিউলাইন যুক্ত করা); "1" মূল্যায়ন করে true(লাইনটি প্রক্রিয়াকরণ করে) এবং print(লাইনটি প্রিন্ট করে)। এই অভিব্যক্তিটিতে একটি শর্তযুক্তও যুক্ত করা যেতে পারে, উদাহরণস্বরূপ, কেবল কোনও প্যাটার্নের সাথে মিল রেখে লাইনে কাজ করা: awk 'BEGIN { ORS=" " } /pattern/ { print $0 } END { print "\n"} '
মাইকেল 25

2
: আপনি এটি আরো simle কি করতে পারেন codefile.txt যাও awk 'ওআিএস = ""'code
Udi,

ততক্ষণে এই জাতীয় উপাখ্যান ব্যবহার করার সময়, দুর্ভাগ্যক্রমে, ফাইলের শেষ লাইন ফিডটিও মুছে ফেলা হয়। Tr ক্যাট ফাইলের মতো সাবসিতে 'টিআর' ব্যবহারের বিষয়ে উপরে প্যাট্রিক ডার্ক উত্তর দেখুন প্রতিধ্বনি $ (ত্র "\ 012" "") `যা কৌশলটি করে। নিফটি।
বার্নি রিইটার

143

নুন -zবিচ্ছিন্ন রেকর্ড (লাইন) জন্য gnu সেড একটি বিকল্প আছে । আপনি কেবল কল করতে পারেন:

sed -z 's/\n/ /g'

4
এমনকি যদি ইনপুটটিতে নালগুলি থাকে তবে সেগুলি সংরক্ষণ করা হবে (রেকর্ড ডেলিমিটার হিসাবে)।
টবির স্পিড

6
কোনও শূন্যতা না থাকলে এই পুরো ইনপুটটি লোড করবে না? এক্ষেত্রে কোনও মাল্টি-গিগাবাইট ফাইল প্রক্রিয়া করা ক্র্যাশ হতে পারে।
রুসলান

3
@ রুসলান, হ্যাঁ এটি পুরো ইনপুট লোড করে। এই দ্রবণটি মাল্টি-গিগাবাইট ফাইলগুলির জন্য ভাল ধারণা নয়।
জাজাও

7
এটি গুরুত্ব সহকারে সেরা উত্তর। অন্যান্য এক্সপ্রেশনগুলি মনে রাখার জন্য খুব সংকীর্ণ। @ জাজোয়া আপনি এটি দিয়ে ব্যবহার করতে পারেন -u, --unbufferedmanপুরোনো যাদুকর বলে: "ইনপুট ফাইল থেকে ডাটা ন্যূনতম পরিমাণ লোড আরো প্রায়ই আউটপুট বাফার ফ্লাশ"।
not2qubit

তাই। অনেক। এই.
sjas

85

পার্ল সংস্করণ উপায় আপনার প্রত্যাশিত কাজ করে।

perl -i -p -e 's/\n//' file

মন্তব্যে নির্দেশিত হিসাবে, এটি লক্ষণীয় যে এই জায়গায়টি সম্পাদিত হয়। -i.bakআপনার নিয়মিত অভিব্যক্তিটি যতটা স্মার্ট হিসাবে ভাবছেন তেমন ক্ষেত্রে প্রতিস্থাপনের আগে আপনাকে মূল ফাইলটির একটি ব্যাকআপ দেবে ।


23
দয়া করে কমপক্ষে উল্লেখ করুন যে -iপ্রত্যয় ছাড়া কোনও ব্যাকআপ তৈরি করে না-i.bakআপনাকে একটি সহজ, কুরুচিপূর্ণ ভুল থেকে রক্ষা করে (বলুন, -pফাইলটি টাইপ করতে ভুলে যাওয়া এবং ফাইলটি শূন্য করা)।
টেলিমাচাস

6
@ টেলিম্যাচাস: এটি একটি সুস্পষ্ট পয়েন্ট, তবে এটি কোনওভাবেই যুক্তিযুক্ত হতে পারে। আমি এটির উল্লেখ না করার প্রধান কারণটি হ'ল ওপি-র প্রশ্নের উত্সাহিত উদাহরণ ব্যাকআপ তৈরি করে না, সুতরাং এটি এখানে অতিরিক্ত অতিরিক্ত মনে হয়। অন্য কারণটি হ'ল আমি ব্যাকআপের কার্যকারিতাটি আসলে কখনই ব্যবহার করি নি (আমি স্বয়ংক্রিয়ভাবে ব্যাকআপগুলি বিরক্তিকর মনে করি, আসলে), তাই আমি সর্বদা সেখানে ভুলে যাই। তৃতীয় কারণটি হ'ল এটি আমার কমান্ড লাইনের চারটি অক্ষর দীর্ঘ করে দেয়। ভাল বা খারাপ (সম্ভবত আরও খারাপ) জন্য, আমি একটি বাধ্যতামূলক সংক্ষিপ্তবাদী; আমি কেবল ব্রেভিটি পছন্দ করি। আমি বুঝতে পারি আপনি একমত না। ভবিষ্যতে ব্যাকআপ সম্পর্কে সতর্ক করতে আমি যথাসাধ্য চেষ্টা করব।
ire_and_curses

6
@ আইরে_আর_ক্রেসস: আসলে, আপনি আমাকে অগ্রাহ্য করার জন্য ঠিক একটি জঘন্য যুক্তি দিয়েছিলেন। এটি হ'ল, আপনার পছন্দের কারণ রয়েছে এবং আমি পছন্দগুলির সাথে একমত হই বা না নিই, আমি অবশ্যই এটিকে সম্মান করি। আমি কেন পুরোপুরি নিশ্চিত নই, তবে আমি ইদানীং এই বিশেষ জিনিসটি সম্পর্কে ছিঁড়েছি ( -iপ্রত্যয় ছাড়াই পার্লের পতাকা)। আমি নিশ্চিত যে খুব শীঘ্রই সম্পর্কে উত্সাহিত করার জন্য আমি অন্য কিছু খুঁজে পাব। :)
টেলিমাচাস

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

যদি স্টিভেনলু পার্ল কোনও ফাইলের নাম সরবরাহ না করা হয় তবে ডিফল্টরূপে STDIN থেকে পড়তে হবে। সুতরাং আপনি যেমন করতে পারেনperl -i -p -e 's/\n//' < infile > outfile
ire_and_curses

44

কার দরকার sed? এখানে bashউপায়:

cat test.txt |  while read line; do echo -n "$line "; done

2
আপভোট, আমি সাধারণত শীর্ষ উত্তরটি ব্যবহার করি, তবে এটির মাধ্যমে / ডিভ / ইউরেনডমটি পাইপ করার সময়, ইওএফ না হওয়া পর্যন্ত সেড মুদ্রণ করবে না এবং ^ সি কোনও ইওএফ নয়। এই সমাধানটি যখনই একটি নতুন লাইন দেখে তখনই মুদ্রণ করে। ঠিক আমার কী দরকার! ধন্যবাদ!
ভাসিলি শারাপভ

1
তবে কেন নয়: প্রতিধ্বনিত `বিড়াল দিন.txt` এই পোস্ট থেকে
টনি

9
@ টনি কারণ ব্যাকটিকগুলি অবমূল্যায়ন করা হয়েছে এবং বিড়ালটি অপ্রয়োজনীয় ;-) ব্যবহার করুন: প্রতিধ্বনি $ (<দিন.txt)
সেউমাস্যাক

10
এমনকি ব্যবহার না করেই cat: while read line; do echo -n "$line "; done < test.txt। সাব-শেল সমস্যা হলে দরকারী হতে পারে।
কার্লো কান্নাস 20'14

5
echo $(<file)সংকুচিত সব একটি একক স্থান, না শুধু নতুন লাইন থেকে হোয়াইটস্পেস: এই কি ওপি জিজ্ঞাসা করা হয় ছাড়িয়ে যায়।
গ্লেন জ্যাকম্যান

27

পুরো ফাইলটিকে মেমরির মধ্যে না পড়েই, ডাব্লু ব্যবহার করে স্পেস দিয়ে সমস্ত নিউলাইনগুলি প্রতিস্থাপন করতে:

awk '{printf "%s ", $0}' inputfile

আপনি যদি একটি চূড়ান্ত নিউলাইন চান:

awk '{printf "%s ", $0} END {printf "\n"}' inputfile

আপনি স্থান ব্যতীত অন্য একটি অক্ষর ব্যবহার করতে পারেন:

awk '{printf "%s|", $0} END {printf "\n"}' inputfile

END{ print ""}একটি পিছনের নতুন লাইনের জন্য একটি সংক্ষিপ্ত বিকল্প।
ইসহাক


21

তিনটি জিনিস.

  1. tr(বা cat, ইত্যাদি) একেবারে প্রয়োজন হয় না। (জিএনইউ) sedএবং (জিএনইউ) awkএকত্রিত হয়ে আপনার প্রয়োজনীয় পাঠ্যের প্রসেসিংয়ের 99.9% করতে পারে।

  2. স্ট্রিম! = লাইন ভিত্তিক edলাইন-ভিত্তিক সম্পাদক is sedএটি না. পার্থক্য সম্পর্কে আরও তথ্যের জন্য সেড লেকচার দেখুন । সর্বাধিক লোকেরা sedলাইন-ভিত্তিক বলে বিভ্রান্ত হয় কারণ এটি সাধারণত ডিফল্টরূপে সিম্পল ম্যাচের সাথে মিলিত প্যাটার্নটিতে খুব লোভী নয় - উদাহরণস্বরূপ, যখন প্যাটার্ন সন্ধান এবং এক বা দুটি অক্ষর দ্বারা প্রতিস্থাপন করা হয় তখন এটি ডিফল্টরূপে কেবল প্রথম ম্যাচে প্রতিস্থাপন করে এটি (বৈশ্বিক কমান্ড দ্বারা অন্যথায় নির্দিষ্ট না করা) সন্ধান করে। এমনকি স্ট্রিম-ভিত্তিক না হয়ে লাইন-ভিত্তিক থাকলেও বিশ্বব্যাপী কমান্ড থাকবে না, কারণ এটি একবারে কেবল রেখার মূল্যায়ন করবে। দৌড়ানোর চেষ্টা করুন ed; আপনি পার্থক্য লক্ষ্য করবেন। edআপনি যদি নির্দিষ্ট লাইনগুলিতে (যেমন একটি লুপ হিসাবে) পুনরাবৃত্তি করতে চান তবে বেশ কার্যকর, তবে বেশিরভাগ সময় আপনি কেবল চাইবেন sed

  3. বলা হচ্ছে যে,

    sed -e '{:q;N;s/\n/ /g;t q}' file
    

    জিএনইউ sedসংস্করণ ৪.২.১-এ ঠিকঠাক কাজ করে । উপরের কমান্ডটি সমস্ত নতুনলাইনগুলি স্পেস দিয়ে প্রতিস্থাপন করবে। এটি কুরুচিপূর্ণ এবং টাইপ করতে কিছুটা জটিল, তবে এটি ঠিক কাজ করে। {}এর আউট রাখা যেতে পারে হিসাবে তারা শুধুমাত্র মানসিক সুস্থতা কারণে অন্তর্ভুক্ত করছি।


3
একজন ব্যক্তি হিসাবে যিনি কেবলমাত্র sedবেসিক স্টাফগুলি করার পক্ষে যথেষ্ট জানেন , আপনি যা করতে পারেন সে সম্পর্কে এটির চেয়ে বেশি বলার অপেক্ষা রাখে না sedবরং কী চলছে তা বোঝা কত সহজ। আমার সাথে কাজ করতে খুব কষ্ট হয় sedতাই আমি যখন এটি ব্যবহার করতে পারি তখন একটি সহজ কমান্ড পছন্দ করি।
নট

শর্তসাপূর্ণ t qজাম্প হিসাবে ব্যবহার করে s/\n / /এটি পুরো ফাইলটিকে মেমরির মধ্যে না পড়েই ( যেমন একটি স্পেস দিয়ে শুরু হওয়া সমস্ত লাইনগুলিতে যোগদানের মতো ) প্যাটার্ন দিয়ে কাজ করে । একাধিক মেগাবাইট ফাইল রূপান্তর করার সময় হ্যান্ডি।
পাঠ্যকাল

আপনি যে নিবন্ধটি সংযুক্ত করেছেন তাতে আপনি কী বলছেন তা প্রতিফলিত হয় না
hek2mgl

এটি বড় ইনপুটটিতে গৃহীত উত্তরের চেয়ে প্রায় 800 গুণ ধীর। এটি ক্রমবর্ধমান বৃহত ইনপুটটিতে প্রতিটি লাইনের বিকল্প চালনার কারণে।
থোর

13

এর সাথে উত্তর: একটি লেবেল ...

আমি সেড ব্যবহার করে কীভাবে একটি নতুন লাইন () n) প্রতিস্থাপন করতে পারি?

... কমান্ড লাইনে 7.2 ফ্রিবিএসে কাজ করে না:

(ইকো ফু; ইকো বার) | সেড ': এ; এন; $! বা; এস / \ এন / / জি'
সেড: 1: ": এ; এন; $! বা; এস / \ এন / / জি": অব্যবহৃত লেবেল 'এ; এন; ba! বা; এস / \ এন / / জি'
foo বিন্যাস
বার

তবে আপনি যদি একটি ফাইলের মধ্যে সেড স্ক্রিপ্টটি রাখেন বা সেড স্ক্রিপ্টটি "বিল্ড" করার জন্য ব্যবহার করেন ...

> (ইকো ফু; ইকো বার) | sed -e: a -e N -e 'ba! ba' -e 's / \ n / / g'
ফু বার

বা ...

> cat > x.sed << eof
:a
N
$!ba
s/\n/ /g
eof

> (echo foo; echo bar) | sed -f x.sed
foo bar

ওএস এক্সে সেডও একই রকম হতে পারে।


এম কেএস ব্যবহার করে উইন্ডোজে-টি যুক্তিগুলির সিরিজটি আমার জন্য কাজ করেছিল! ধন্যবাদ!
জেমসজি

12

সহজে বোঝার সমাধান olution

আমার এই সমস্যা ছিল কিকারটি হ'ল বিএসডির (ম্যাক ওএস এক্স) এবং জিএনইউ'র (লিনাক্স এবং সাইগউইন ) sedএবং tr:

$ echo 'foo
bar
baz


foo2
bar2
baz2' \
| tr '\n' '\000' \
| sed 's:\x00\x00.*:\n:g' \
| tr '\000' '\n'

আউটপুট:

foo
bar
baz

(নতুন লাইনের পিছনে রয়েছে)

এটি লিনাক্স, ওএস এক্স, এবং বিএসডি - এমনকি ইউটিএফ -8 সমর্থন ছাড়াই বা ক্রেপি টার্মিনাল সহ কাজ করে।

  1. trঅন্য একটি চরিত্রের সাথে নিউলাইনটি অদলবদল করতে ব্যবহার করুন ।

    NULL( \000বা \x00) দুর্দান্ত কারণ এটির জন্য ইউটিএফ -8 সমর্থন প্রয়োজন নেই এবং এটি ব্যবহারের সম্ভাবনা নেই।

  2. sedমেলে ব্যবহার করুনNULL

  3. আপনার trযদি প্রয়োজন হয় তবে অতিরিক্ত নিউলাইনগুলি আবার সরিয়ে নিতে ব্যবহার করুন


1
নামকরণের উপর একটি সূক্ষ্ম নোট: চরিত্রটি \000সাধারণত NUL(এক এল) হিসাবে চিহ্নিত হয় , এবং NULLসাধারণত শূন্য- পয়েন্টার (সি / সি ++ তে) সম্পর্কে কথা বলার সময় ব্যবহৃত হয় ।
sqweek


9

আমি কোনও বিশেষজ্ঞ নই, তবে আমি অনুমান করি যে sedআপনাকে প্রথমে পরের লাইনটি প্যাটার্ন স্পেসে যুক্ত করতে হবে, বিজ " N" ব্যবহার করে । সেড অ্যান্ড অজক বইয়ের "অ্যাডভান্সড সেড কমান্ডস" এর "মাল্টলাইন প্যাটার্ন স্পেস" বিভাগ থেকে (ডেল ডগের্টি এবং আর্নল্ড রবিনস; ও'রিলি 1997; পৃষ্ঠা 107 পূর্বরূপ ):

মাল্টলাইন নেক্সট (এন) কমান্ড একটি নতুন লাইন ইনপুট পড়ে এবং প্যাটার্ন স্পেসের বিষয়বস্তুগুলিতে সংযোজন করে একাধিক প্যাটার্ন স্পেস তৈরি করে। প্যাটার্ন স্পেসের মূল সামগ্রী এবং নতুন ইনপুট লাইনটি একটি নতুন লাইনের দ্বারা পৃথক করা হয়েছে। এম্বেড করা নতুন লাইনের অক্ষরটি পালানোর ক্রম "\ n" দ্বারা নিদর্শনগুলিতে মিলতে পারে। মাল্টলাইন প্যাটার্ন স্পেসে, মেটাচার্যাক্টর "^" প্যাটার্ন স্পেসের খুব প্রথম অক্ষরের সাথে মেলে, এবং কোনও এমবেডড নিউলাইন (গুলি) অনুসরণ করে এমন অক্ষর নয়। একইভাবে, "$" প্যাটার্ন স্পেসে কেবল চূড়ান্ত নিউলাইনটি মেলে, এবং কোনও এমবেডড নিউলাইন (গুলি) নয়। নেক্সট কমান্ড কার্যকর হওয়ার পরে, স্ক্রিপ্টের পরবর্তী কমান্ডগুলিতে নিয়ন্ত্রণটি প্রেরণ করা হবে।

থেকে man sed:

[2addr] এন

আসল উপাদানটি মূল বিষয়বস্তু থেকে পৃথক করতে একটি এম্বেডড নিউলাইন অক্ষর ব্যবহার করে প্যাটার্ন স্পেসে ইনপুটটির পরবর্তী লাইনটি যুক্ত করুন। নোট করুন যে বর্তমান লাইন নম্বর পরিবর্তন হয়।

আমি এটি (একাধিক) খারাপ ফর্ম্যাটেড লগ ফাইলগুলি অনুসন্ধান করতে ব্যবহার করেছি , যাতে অনুসন্ধানের স্ট্রিংটি পরের লাইনে "অনাথ" খুঁজে পাওয়া যেতে পারে।


7

ট্যাবগুলির সাথে নতুন লাইনের প্রতিস্থাপনের জন্য টিআর ব্যবহার করে নতুন লাইনের জিনিসটি ঘুরে দেখার জন্য আমি একটি হাইব্রিড পদ্ধতির ব্যবহার করেছি, তারপরে যা খুশি তা দিয়ে ট্যাবগুলি প্রতিস্থাপন করেছি। এই ক্ষেত্রে, "
" যেহেতু আমি HTML বিরতি উত্পন্ন করার চেষ্টা করছি।

echo -e "a\nb\nc\n" |tr '\n' '\t' | sed 's/\t/ <br> /g'`

6

উপরের "টিআর" সমাধানের প্রতিক্রিয়া হিসাবে, উইন্ডোজে (সম্ভবত ট্র এর গ্নুইউন 32 সংস্করণ ব্যবহার করা হচ্ছে) প্রস্তাবিত সমাধান:

tr '\n' ' ' < input

আমার পক্ষে কাজ করছে না, এটি ত্রুটি বা আসলে কোনও কারণে \ nw / '' প্রতিস্থাপন করবে।

টিআর এর অন্য একটি বৈশিষ্ট্য ব্যবহার করে, "মুছুন" বিকল্প -d যদিও কাজ করেছে:

tr -d '\n' < input

বা '\ r \ n' এর পরিবর্তে '\ n'


3
উইন্ডোজ, আপনার সম্ভবত ব্যবহার করা প্রয়োজন tr "\n" " " < input। উইন্ডোজ শেল (cmd.exe) অ্যাস্টোস্ট্রোফকে একটি উদ্ধৃতি চরিত্র হিসাবে বিবেচনা করে না।
কিথ থম্পসন

না, উইন্ডোজ 10 উবুন্টু সাব সিস্টেমে আপনাকে ব্যবহার করতে হবেtr "\n\r" " " < input.txt > output.txt
ইউজার 1491819

এই উইন্ডোজ 10 উপর কাজ করে Gnuwin32 ব্যবহার করছে: cat SourceFile.txt | tr --delete '\r\n' > OutputFile.txt। অথবা, গ্নুউইন 32 এর পরিবর্তে, গা (উইন্ডোজে গ্নু) ব্যবহার করুন, github.com/bmatzelle/gow/wiki
Alchemistmatt

5

বুলেট প্রুফ সমাধান। বাইনারি-ডেটা-নিরাপদ এবং POSIX- অনুবর্তী, কিন্তু ধীর।

পসিক্স সেডের জন্য পসিএক্স টেক্সট ফাইল এবং পসিক্স লাইন সংজ্ঞা অনুযায়ী ইনপুট দরকার হয় , তাই নুল-বাইটস এবং খুব দীর্ঘ লাইন অনুমোদিত নয় এবং প্রতিটি লাইন অবশ্যই একটি নতুন লাইন দিয়ে শেষ হবে (শেষ লাইন সহ)। এটি নির্বিচার ইনপুট ডেটা প্রক্রিয়াকরণের জন্য সেড ব্যবহার করা কঠিন করে তোলে।

নিম্নলিখিত সমাধানটি সেডকে এড়িয়ে যায় এবং পরিবর্তে ইনপুট বাইটগুলি অষ্টাল কোডগুলিতে এবং তারপরে আবার বাইটগুলিতে রূপান্তর করে তবে অষ্টাল কোড 012 (নিউলাইন) বাধা দেয় এবং এর জায়গায় প্রতিস্থাপনের স্ট্রিং আউটপুট দেয়। যতদূর আমি সমাধানটি POSIX- অনুবর্তী হিসাবে বলতে পারি, সুতরাং এটি বিভিন্ন প্ল্যাটফর্মের উপর কাজ করা উচিত।

od -A n -t o1 -v | tr ' \t' '\n\n' | grep . |
  while read x; do [ "0$x" -eq 012 ] && printf '<br>\n' || printf "\\$x"; done

পসিএক্স রেফারেন্স ডকুমেন্টেশন: sh , শেল কমান্ড ল্যাঙ্গুয়েজ , ওড , ট্র , গ্রেপ , রিড , [ , প্রিন্টফ

উভয় read, [এবং printfঅন্তত অন্তর্নির্মিত অন্তর্নির্মিত, তবে এটি সম্ভবত পসিক্স দ্বারা গ্যারান্টিযুক্ত নয়, তাই কিছু প্ল্যাটফর্মে এটি হতে পারে যে প্রতিটি ইনপুট বাইট এক বা একাধিক নতুন প্রক্রিয়া শুরু করবে, যা জিনিসগুলি ধীর করে দেবে। এমনকি ব্যাশে এই সমাধানটি প্রায় 50 কেবি / সেকেন্ডে পৌঁছায় তাই এটি বড় ফাইলগুলির জন্য উপযুক্ত নয়।

উবুন্টু (বাশ, ড্যাশ এবং ব্যস্তবক্স), ফ্রিবিএসডি এবং ওপেনবিএসডি-তে পরীক্ষিত।


5

কিছু পরিস্থিতিতে সম্ভবত আপনি RSঅন্য কিছু স্ট্রিং বা চরিত্রে পরিবর্তন করতে পারেন । এই উপায়ে, \ n সাব / জিএসউবির জন্য উপলব্ধ:

$ gawk 'BEGIN {RS="dn" } {gsub("\n"," ") ;print $0 }' file

শেল স্ক্রিপ্টিংয়ের ক্ষমতা হ'ল যদি আপনি এটি এক উপায়ে কীভাবে করতে হয় তা জানেন না তবে আপনি এটি অন্য উপায়ে করতে পারেন। এবং অনেক সময় আপনার কাছে সাধারণ সমস্যার জটিল সমাধান করার চেয়ে আরও কিছু জিনিস বিবেচনায় নেওয়া হয়।

গাওয়াক যে জিনিসটি ধীরে ধীরে ... এবং ফাইলটি মেমরির মধ্যে পড়ে তা সম্পর্কে, আমি এটি জানি না, তবে আমার কাছে মনে হয় যে গোক সেই সময়ে একটি লাইনে কাজ করেছেন এবং খুব দ্রুত (অন্যদের মতো দ্রুত নয়) , তবে লেখার এবং পরীক্ষার সময়ও গণনা করা হয়)।

আমি এমবি এবং এমনকি গিগাবাইট ডেটা প্রসেস করি এবং আমি খুঁজে পাওয়া একমাত্র সীমা লাইন আকার।


5

আপনি যদি উইন্ডোজ লাইন শেষের সাথে মোকাবিলা করার মতো দুর্ভাগ্যজনক হন তবে আপনার এটি \rএবং অপসারণ করতে হবে\n

tr '[\r\n]' ' ' < $input > $output

এই প্রতিস্থাপন [একটি স্পেস দিয়ে, এবং \rএকটি স্পেস দিয়ে, এবং \nএকটি স্পেস দিয়ে, এবং ]একটি স্পেস দিয়ে। tr -d '\r\n' <fileযে কোনও \rবা \nঅক্ষর মুছে ফেলবে , তবে এটি যা চাওয়া হচ্ছে তা নয়। tr -d '\r' <fileযে কোনও \rঅক্ষর মুছে ফেলা হবে (তারা সংলগ্ন কিনা তা নির্বিশেষে \n) যা সম্ভবত কার্যকর হওয়ার সাথে সাথে ওপি'র প্রয়োজনীয়তার জন্য যথেষ্ট সম্ভবত সঠিক (এখনও ধরে নিচ্ছে আপনার trএই ব্যাকস্ল্যাশ স্বরলিপিটি বোঝে)।
ট্রিপলি

4

আপনি ব্যবহার করতে পারেন xargs- এটি \nএকটি স্থানের সাথে ডিফল্টরূপে প্রতিস্থাপন করবে ।

তবে আপনার ইনপুটটিতে unterminated quoteকোনওরকম একটি সমস্যা রয়েছে যদি এটির সমস্যা হয় , যেমন যদি কোনও প্রদত্ত লাইনে উদ্ধৃতি চিহ্নগুলি মেলে না।


xargs সর্বশেষ লাইনটি খুব সুন্দরভাবে পরিচালনা করে:
এএএফারমক্লাব

4

অনুমতি এবং allowing n ব্যবহার করে প্রতিস্থাপন। N

sed -ie -z 's/Marker\n/# Marker Comment\nMarker\n/g' myfile.txt

মার্কার

হয়ে

# চিহ্নিতকারী মন্তব্য

মার্কার


4

কেন আমি এর সাথে একটি সহজ সমাধান খুঁজে পাইনি awk?

awk '{printf $0}' file

printf আপনি যদি কোনও স্থান বা অন্যের সাথে মূল লাইনগুলি আলাদা করতে চান তবে নতুন লাইনগুলি ছাড়াই প্রতিটি লাইন মুদ্রণ করবে:

awk '{printf $0 " "}' file

echo "1\n2\n3" | awk '{printf $0}', এটা আমার জন্য কাজ করে। @ edi9999
Itachi

আপনি ঠিক দুঃখিত, আমি ভুলে গেছি করছি fprintf মধ্যে
edi9999

এই একমাত্র পন্থা যা আমার জন্য উইন্ডোজের গিট ব্যাশের মধ্যে কাজ করেছিল
প্লেটো

3

ম্যাক ওএস এক্সে (ফ্রিবিএসডি সেড ব্যবহার করে):

# replace each newline with a space
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g; ta'
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g' -e ta


3

পশুর ব্যবহার:

awk "BEGIN { o=\"\" }  { o=o \" \" \$0 }  END { print o; }"

2
আপনি যদি বাইরেরগুলি একক উদ্ধৃতিতে পরিবর্তন করেন তবে আপনাকে উদ্ধৃতি চিহ্ন এবং ডলার চিহ্ন এড়াতে হবে না। "O" বর্ণটি সাধারণত একটি পরিবর্তনশীল নাম হিসাবে একটি খারাপ পছন্দ হিসাবে বিবেচিত হয় কারণ এটি "0" ডিজিটের সাথে বিভ্রান্ত হতে পারে। আপনার ভেরিয়েবলটি আরম্ভ করার দরকার নেই, এটি একটি নাল স্ট্রিংয়ের ডিফল্ট হয়। যাইহোক, যদি আপনি না একটি বিদেশী নেতৃস্থানীয় স্থান চাই: awk '{s = s sp $0; sp = " "} END {print s}'। যাইহোক, পুরো ফাইলটিকে মেমরির মধ্যে না পড়ে বিশ্রী ব্যবহার করার জন্য আমার উত্তরটি দেখুন।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

দয়া করে খুঁজে বার করো থর এর উত্তর পরিবর্তে। এই পদ্ধতির তুলনা করার জন্য এটি কোনওভাবেই আরও দক্ষ, পঠনযোগ্য এবং কেবলমাত্র আরও ভাল (যদিও এটি কাজ করবে)!
মিসচিলি

বাবু, আমি পেয়েছি। এটি আমার মুখে ঘষতে হবে না :-) থরটির উত্তর পৃষ্ঠায় উপরে যাই হোক না কেন (যা সঠিক), তাই আপনি কী যত্ন করবেন?
ক্রেলিক

3

আমার বিশেষত একটি সমাধান হোল্ড স্পেসের সমস্ত ফাইল সংযুক্ত করা এবং ফাইলের শেষে সমস্ত নিউলাইনগুলি প্রতিস্থাপন করা:

$ (echo foo; echo bar) | sed -n 'H;${x;s/\n//g;p;}'
foobar

যাইহোক, কেউ আমাকে বলেছিল যে কিছু কিছু প্রয়োগের ক্ষেত্রে হোল্ড স্পেস সীমাবদ্ধ হতে পারে।


1
আপনার উত্তরের খালি স্ট্রিংয়ের সাথে প্রতিস্থাপনটি এই সত্যটি গোপন করে যে হোল্ড স্পেসে সর্বদা এইচ ব্যবহার করার অর্থ হোল্ড স্পেসটি একটি নতুন লাইন দিয়ে শুরু হবে। এটি এড়াতে আপনার ব্যবহার করতে হবে1h;2,$H;${x;s/\n/x/g;p}
জেফ

3

যে কোনও স্ট্রিং দিয়ে নিউলাইনগুলি প্রতিস্থাপন করুন এবং শেষ নিউলাইনটিও প্রতিস্থাপন করুন

খাঁটি trসমাধানগুলি কেবল একটি একক চরিত্রের সাথে প্রতিস্থাপন করতে পারে এবং খাঁটি sedসমাধানগুলি ইনপুটটির শেষ নিউলাইনটিকে প্রতিস্থাপন করে না। নিম্নলিখিত সমাধানগুলি এই সমস্যাগুলি সংশোধন করে এবং বাইনারি ডেটার জন্য নিরাপদ বলে মনে হয় (এমনকি কোনও ইউটিএফ -8 স্থানীয় সহ):

printf '1\n2\n3\n' |
  sed 's/%/%p/g;s/@/%a/g' | tr '\n' @ | sed 's/@/<br>/g;s/%a/@/g;s/%p/%/g'

ফলাফল:

1<br>2<br>3<br>

এটি খারাপ কারণ এটি যে কোনও ইনপুট রয়েছে@
স্টিভেন লু

@ স্টিভেনলু: না, @ইনপুটটি ঠিক আছে। এটি পালাতে %aগিয়ে আবার ফিরে আসে। সমাধানটি পুরোপুরি পসিক্সের সাথে সামঞ্জস্যপূর্ণ নাও হতে পারে, যদিও (ন্যূনাল-বাইটস বাইনারি ডেটার জন্য এতটা ভাল নয়, এবং trআউটপুটটি বৈধ নয় বলে সমস্ত লাইন অবশ্যই নিউলাইনের সাথে শেষ হওয়া উচিত )।
হাকন এ। জর্জল্যান্ড

আহ। আমি দেখেছি আপনি এটি স্থির করেছেন। কিন্ডা কীভাবে একটি সহজ অপারেশন হওয়া উচিত তার জন্য বিশৃঙ্খল, তবে ভাল কাজ।
স্টিভেন লু

3

এটি সেড যা "সাধারণ" প্রতিস্থাপনের পরে নতুন-রেখার পরিচয় দেয়। প্রথমে এটি নতুন-লাইন চরটি ছাঁটাই করে, তারপরে এটি আপনার নির্দেশাবলী অনুসারে প্রক্রিয়া করে, তারপরে এটি একটি নতুন লাইন প্রবর্তন করে।

সেড ব্যবহার করে আপনি প্রতিটি ইনপুট লাইনের জন্য আপনার পছন্দসই স্ট্রিং দিয়ে ছাঁটাবার পরে একটি লাইনের "শেষ" (নতুন-লাইন চরটি নয়) প্রতিস্থাপন করতে পারেন; তবে, সেড বিভিন্ন লাইন আউটপুট দেবে। উদাহরণস্বরূপ, ধরুন আপনি "লাইনের শেষ "টিকে" === "(একটি একক স্থানের পরিবর্তে আরও সাধারণ) দিয়ে প্রতিস্থাপন করতে চেয়েছিলেন:

PROMPT~$ cat <<EOF |sed 's/$/===/g'
first line
second line
3rd line
EOF

first line===
second line===
3rd line===
PROMPT~$

স্ট্রিংয়ের সাথে নতুন-লাইন চরটি প্রতিস্থাপন করতে, আপনি অকার্যকরভাবে, যদিও ট্রেনটি ব্যবহার করতে পারেন, যেমন পূর্বে নির্দেশ করা হয়েছে, নিউলাইন-চরগুলি একটি "বিশেষ চর" দিয়ে প্রতিস্থাপন করতে পারেন এবং তারপরে যে বিশেষ চরটি আপনি চান তার সাথে প্রতিস্থাপন করতে সেড ব্যবহার করতে পারেন ।

উদাহরণ স্বরূপ:

PROMPT~$ cat <<EOF | tr '\n' $'\x01'|sed -e 's/\x01/===/g'
first line
second line
3rd line
EOF

first line===second line===3rd line===PROMPT~$

3

আপনি এই পদ্ধতিটিও ব্যবহার করতে পারেন

sed 'x;G;1!h;s/\n/ /g;$!d'

ব্যাখ্যা

x   - which is used to exchange the data from both space (pattern and hold).
G   - which is used to append the data from hold space to pattern space.
h   - which is used to copy the pattern space to hold space.
1!h - During first line won't copy pattern space to hold space due to \n is
      available in pattern space.
$!d - Clear the pattern space every time before getting next line until the
      last line.

প্রবাহ:
প্রথম লাইনটি যখন ইনপুট থেকে আসে, এক্সচেঞ্জ হয়, সুতরাং 1 স্থান ধরে রাখতে যায় এবং \ n প্যাটার্ন স্পেসে আসে, তারপরে হোল্ড স্পেসটিকে প্যাটার্ন স্পেসে যুক্ত করে, এবং তারপরে প্রতিস্থাপনটি সম্পাদন করা হয় এবং প্যাটার্ন স্পেস মুছে ফেলা হয়।
দ্বিতীয় লাইনের আদান প্রদানের সময়, 2 স্থান ধরে রাখতে যায় এবং 1 প্যাটার্ন স্পেসে আসে, তারপরে Gহোল্ড স্পেসটি প্যাটার্ন স্পেসে যুক্ত করুন, তারপরে hপ্যাটার্নটি অনুলিপি করুন এবং প্রতিস্থাপনটি তৈরি করা এবং মুছে ফেলা হবে। ইওফ পৌঁছানো অবধি এই অপারেশনটি অব্যাহত থাকে তারপরে নির্ভুল ফলাফল মুদ্রণ করুন।


তবে, সতর্ক হতে হবে যে echo 'Y' | sed 'x;G;1!h;s/\n/X/g;$!d'ফলাফল XY
ভুতুড়ে

3

আরেকটি গনুহ sed পদ্ধতি, যেমন প্রায় একই জ্লট Botykai এর উত্তর , কিন্তু এই ব্যবহারের sedএর কম ঘন ঘন ব্যবহৃত y( লিপ্যন্তর ) কমান্ড, যা সংরক্ষণ করে এক বাইট কোড (চিহ্ন এর g):

sed ':a;N;$!ba;y/\n/ /'

একের yচেয়ে দ্রুত গতিতে চলতে পারে আশা করা s(সম্ভবত trগতিতে 20x দ্রুত) তবে জিএনইউ সেডে ভি 4.2.2 y তুলনায় প্রায় 4% ধীর গতিতে রয়েছে s


আরও বহনযোগ্য বিএসডি sed সংস্করণ:

sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /'

2
বিএসডি সেড সহ yসিএ 15% দ্রুত হয়। কার্যকারী উদাহরণের জন্য এই উত্তরটি দেখুন ।
থোর

এছাড়াও, BSD সেড কমান্ডগুলির সাথে একটি লেবেল পরে সমাপ্ত হওয়া দরকার, তাই sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /'যাওয়ার উপায় হবে।
ঘোটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.