সেড কি নতুন লাইনের চরিত্রগুলি প্রতিস্থাপন করতে পারে?


42

সেড এবং নতুন লাইনের চরিত্র নিয়ে কোনও সমস্যা আছে?
আমার নীচের বিষয়বস্তুগুলির সাথে একটি ফাইল টেস্ট.টেক্সট আছে

aaaaa  
bbbbb  
ccccc  
ddddd  

নিম্নলিখিতগুলি কাজ করে না:
sed -r -i 's/\n/,/g' test.txt

আমি জানি যে আমি trএটির জন্য ব্যবহার করতে পারি তবে আমার প্রশ্নটি কেন সেডের সাথে এটি সম্ভব নয় বলে মনে হয়।

যদি লাইন দ্বারা ফাইল লাইন প্রক্রিয়াজাতকরণের এটির পার্শ্ব প্রতিক্রিয়া হয় তবে আমি কেন আগ্রহী তা জানতে আগ্রহী হব। আমি মনে করি grepনতুন লাইন সরিয়ে দেয়। সেড কি একই কাজ করে?


1
এই ক্ষেত্রে সেড ব্যবহারের সেরা সরঞ্জাম নাও হতে পারে (উদাঃ "টিআর")। এমন সরঞ্জামগুলি রয়েছে যা আরও স্বজ্ঞাত, পড়া / বজায় রাখা সহজ, আরও ভাল পারফর্ম করা (বিশেষত বড় ডেটাতে) ইত্যাদি ... আপনার হাতুড়িটি স্ক্রুগুলি রাখার জন্য ব্যবহার করবেন না (এটি কাজ করেও)। আপনি একটি তুলনা খুঁজে পেতে পারেন: http://slash4.de/blog/python/sed-replace-newline-or-python-awk-tr-perl-xargs.html
ওমোসার

2
trএকটি পেছন যোগ করবে ,এবং একটি নির্বিঘ্ন লাইন আউটপুট হবে। pasteপরিবর্তে ব্যবহার করার জন্য সেরা:paste -sd , test.txt
স্টাফেন চেজেলাস

উত্তর:


48

GNU সহ sedএবং সরবরাহ POSIXLY_CORRECTকরা পরিবেশে নেই (একক-লাইন ইনপুট জন্য):

sed -i ':a;N;$!ba;s/\n/,/g' test.txt

Https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n থেকে :

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

সমস্যাটি বোঝায় যে সমস্যাটি রেখার দ্বারা লাইন পড়ে। তবে আমি বুঝতে পারি না কেন এটি একটি সমস্যা t এটি কেবল লাইনটি পড়তে পারে এবং নতুন লাইনের চরিত্রটি (বা শেষ চরিত্র) এর সাথে একটি,
জিম

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

এর ফলাফলba: Event not found
krb686

@ krb686 আপনি উল্লেখ করছেন "এটি" কী? আপনি কি sedসেই সঠিক বিকল্পগুলি দিয়ে উপরের কমান্ডটি চালিয়েছেন? কোন test.txt ফাইল? sed(চেষ্টা sed --version) এর কোন সংস্করণ দিয়ে ?
অ্যান্থন

@ অ্যান্টন দুঃখিত, আমি মনে করি আমি "দ্য" বলতে চাইছিলাম। আমি অন্য একটি এসও পোস্ট পড়েছি যা আমাকে জানিয়েছিল যে সিএসএস থেকে আমাকে পালাতে হবে !। মজার বিষয় হল, এটি এখনও আমার পক্ষে কার্যকর হয়নি এবং আমি !আমার .cshস্ক্রিপ্টে দ্বিগুণ পালাতে হয়েছিল । সুতরাং এই মুহূর্তে আমার আসলেই কোনও সমস্যা নেই, তবে আপনি কি জানেন যে এটি কেন হতে পারে? আমার জন্য যা কাজ করেছিল তা ছিলsed :a;N;$\\!ba;s/\n/ /g'
krb686

16

এটি জিএনইউয়ের সাথে কাজ করে sed:

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

-z 4.2.2 থেকে অন্তর্ভুক্ত করা হয়েছে

বিশেষ দ্রষ্টব্য। -zডিলিমিটারটি নাল অক্ষরগুলিতে পরিবর্তন করে ( \0)। যদি আপনার ইনপুটটিতে কোনও নাল অক্ষর না থাকে তবে পুরো ইনপুটটিকে একক লাইন হিসাবে বিবেচনা করা হবে। এটি তার সীমাবদ্ধতার সাথে আসতে পারে ।

শেষ লাইনের নতুন লাইনটি প্রতিস্থাপন করা এড়াতে আপনি এটিকে আবার পরিবর্তন করতে পারেন:

sed -z 's/\n/,/g;s/,$/\n/'

( sedআবার জিএনইউ সিনট্যাক্সটি কী, তবে পুরো বিষয়টি কেবল জিএনইউ হওয়ায় এটি কোনও ব্যাপার নয়)


3
এটি পেছনের নতুন লাইনও প্রতিস্থাপন করবে যা ওপি যা চায় তা নাও হতে পারে ... ফলাফলটিকে মাইক্রোজারের সমাধানের সাথে তুলনা করুন ।
don_crissti

7

ওরাকল এর ওয়েব সাইট থেকে:

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

মূলত এর অর্থ এটি যেহেতু সেড লাইনের দ্বারা লাইন পড়ছে নতুন লাইনের চরিত্রটি মেলে না।

Https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n থেকে সমাধানটি হ'ল:

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

বা, একটি বহনযোগ্য সংস্করণে ( ;জাম্প মার্ক লেবেলের পরে সংক্ষেপ না করে)

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

কীভাবে সেই পৃষ্ঠাতে সরবরাহ করা হয় তার একটি ব্যাখ্যা।


আমি ভিপিএন লগগুলি পার্স করার জন্য এর একটি পরিবর্তিত ফর্ম ব্যবহার করেছি এবং একই লাইনে ব্যবহারকারীকে "প্রমাণীকৃত" এবং সময় স্ট্যাম্পের তথ্য রাখি। চিয়ার্স!
ব্যবহারকারী 208145

মনে রাখবেন যে সিনট্যাক্সটি জিএনইউ নির্দিষ্ট, এবং এমনকি sedজিএনইউর সাথেও, যদি POSIXLY_CORRECT পরিবেশে থাকে এবং ইনপুটটির কেবল একটি লাইন থাকে, কোনও আউটপুট থাকবে না।
স্টাফেন চেজেলাস

5

sed\nপ্যাটার্ন স্পেসটি পপুলিংয়ের ঠিক আগেই সর্বদা পিছনে থাকা ইলাইনটিকে সরিয়ে দেয় এবং এর স্ক্রিপ্টের ফলাফলগুলি লেখার আগে একটি যুক্ত করে। একটি \newline বিভিন্ন উপায়ে প্যাটার্ন-স্পেসে থাকতে পারে - তবে এটি সম্পাদনার ফলাফল না হলে কখনও হয় না। এটি গুরুত্বপূর্ণ - এর প্যাটার্ন স্পেসের \newlines sedসর্বদা একটি পরিবর্তন প্রতিবিম্বিত করে , এবং ইনপুট প্রবাহে কখনই ঘটে না। \newlines একমাত্র ডেলিমিটার যা কোনও sedডার অজানা ইনপুট দিয়ে গণনা করতে পারে।

আপনি যদি সমস্ত \nইলাইনগুলি কমা দিয়ে প্রতিস্থাপন করতে চান এবং আপনার ফাইলটি খুব বড় না হয় তবে আপনি এটি করতে পারেন:

sed 'H;1h;$!d;x;y/\n/,/'

একটি ইনলাইন চরিত্র অনুসরণ করে - hপ্রথমটি বাদে hপুরানো স্থানটিকে ওভাররাইট করে - যা প্রতিটি ইনপুট লাইনটিকে পুরানো \nজায়গাতে সংযুক্ত করে। এটি আউটপুট থেকে সর্বশেষ dনয় প্রতিটি লাইন একাদশ $!। শেষ লাইনে Hপুরানো এবং প্যাটার্ন স্পেসগুলি ই xপরিবর্তিত হয় এবং সমস্ত ই- লাইন \nঅক্ষর কমাতে y///অনুবাদ করা হয়।

বড় ফাইলগুলির জন্য এই ধরণের জিনিসটি সমস্যা তৈরি করতে বাধ্য - sedলাইন-বাউন্ডারে বাফারের বাফার, যা এই ধরণের ক্রিয়াকলাপের সাথে সহজেই ভরাট হতে পারে।


2

বিকল্পভাবে, আপনি কিছুটা সহজ বাক্য গঠন ব্যবহার করতে পারেন:

sed ':a;N;s/\n/,/g;ba'

... সিকোয়েন্স অর্ডার পরিবর্তন করা হচ্ছে।


3
কিন্তু sপ্রতিটি ইনপুট লাইনের জন্য একটি প্যাটার্ন স্পেসে কমান্ড চালায় যা ক্রমবর্ধমান বড়।
স্টাফেন চেজেলাস

1

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

জিএনইউ এটি বলে:

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

আমার যোগ করার মতো খুব বেশি কিছুই নেই তবে আমি আপনাকে আমার সেডের জন্য গাইডের দিকে নির্দেশ করতে চাই । এটা দুর্দান্ত। http://www.grymoire.com/Unix/Sed.html

এবং এখানে আমার সমাধান:

for i in $(cat test.txt); do echo -n $i','; done; echo '' >> somewhere

ভাল এটি কাজ করে



-1

যাক আপনি নতুন লাইনের দ্বারা প্রতিস্থাপন করতে চান বলুন \n। আমি এটি করতে চেয়েছিলাম, তাই আমি যা করেছি তা এখানে:

(echo foo; echo bar; echo baz) | sed -r '$!s/$/\\n/' | tr -d '\n' 
# Output: foo\nbar\nbaz

এটি যা করে তা এখানে: শেষ , সংযোজন ব্যতীত অন্য সমস্ত লাইন \n। তারপরে, সাথে নিউলাইনগুলি মুছুন tr


-rকেবল জিএনইউতে উপলব্ধ sed, বিএসডি নয়।
কেনারব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.