মাকোসগুলিতে নতুন লাইনের সাথে কমা প্রতিস্থাপন করবেন?


287

আমার আইডি এর একটি ফাইল রয়েছে যা কমা দ্বারা পৃথক করা আছে। আমি একটি নতুন লাইন দিয়ে কমাগুলি প্রতিস্থাপনের চেষ্টা করছি। আমি চেষ্টা করেছিলাম:

sed 's/,/\n/g' file

কিন্তু এটা কাজ করছে না. আমি কী মিস করছি?


12
চেষ্টা tr , '\n'। আমার ধারণা, সেড \nপ্লেইন টেক্সট হিসাবে ব্যবহার করে।
যুবরাজ জন ওয়েসলি

1
যে কাজ! বিড়াল ফাইল | tr, '\ n'
ওয়াইল্ডবিল 25'12

7
tr , '\n' < file- পাইপ নেই
যুবরাজ জন ওয়েসলি

gস্ক্রিপ্ট শেষে কি জন্য? আমি এটি ছাড়া একই আচরণ পেতে।
হ্যালো গুডবাই 27'15

আপনি কোন শেল ব্যবহার করছেন? এটি আমার জন্য ব্যাশ শেল ব্যবহার করে কাজ করে।
হ্যালো গুডবাই

উত্তর:


362

trপরিবর্তে ব্যবহার করুন:

tr , '\n' < file

আমি 'প্রতিস্থাপনের সন্ধান করছিলাম।' পিরিয়ড, এবং এটিই আমি সমাধান খুঁজছিলাম :)
জোনা

1
এটি বাশ শেল $ ট্রিতে ঘোরে না, '\ n' আইট্রের ব্যবহার: টিআর [-সিসিএস] স্ট্রিং 1 স্ট্রিং 2 টিআর [-সিসিইউ] -ডি স্ট্রিং 1 টি [-সিসিউ] -এস স্ট্রিং 1 টিআর [-সিসিইউ] -এস স্ট্রিং 1 স্ট্রিং 2
শিক্ষার্থী

5
সেমিকোলন দিয়ে কমা প্রতিস্থাপন করাও কাজ করে:tr ',' ';' < input.csv > output.csv
উইম দেবলাউউ

304

একটি এএনএসআই-সি উদ্ধৃত স্ট্রিং ব্যবহার করুন $'string'

সিডে উঠতে আপনার একটি ব্যাকস্ল্যাশ-পলায়নের আক্ষরিক নিউলাইন দরকার। কমপক্ষে ব্যাশে, $''স্ট্রিংগুলি \nএকটি নতুন নিউলাইন দিয়ে প্রতিস্থাপন করবে , তবে তারপরে আপনাকে ব্যাকস্ল্যাশ দ্বিগুণ করতে হবে যা নিউ লাইনের হাত থেকে বাঁচতে দেখবে

echo "a,b" | sed -e $'s/,/\\\n/g'

নোট করুন এটি সমস্ত শেলগুলিতে কাজ করবে না , তবে সর্বাধিক সাধারণ বিষয়গুলিতে কাজ করবে।


5
আশ্চর্যজনক, এটি একটি ব্যাকস্ল্যাশ কম অর্থাৎ কাজ করে echo "a,b" | sed -e $'s/,/\\n/g
আলেকজান্দ্রে হোল্ডেন ডালি

2
সম্মত। আরও তথ্যের জন্য এর "QUOTING" বিভাগটি দেখুন man bash
tboyce12

7
এটি ওএসএক্স 10.11 এর সাথে কাজ করছে: sed -E $'s/<\\/br>/\\\n/g' fileগ্নু-সেড ইনস্টল করার দরকার নেই
ব্রাইস

2
ওএস এক্স 10.7 এ প্রদত্ত উদাহরণ সহ কাজ করে যাচাই করা হয়েছে। -eঅংশ প্রয়োজন নেই বলে মনে হয়।
ইয়ংওয়েই উ

1
উত্তরের উদাহরণটি তাত্ক্ষণিকভাবে আমার জন্য ওএসএক্স 10.11.5 এ কাজ করে
জুরিয়ানান

122
sed 's/,/\
/g'

ম্যাক ওএস এক্সে কাজ করে


3
এর জন্য ধন্যবাদ - ভাবলাম কেন আমার পুরানো লিনাক্স ট্রিক ওএসএক্সে কাজ করে না? কিন্তু এই না!
Wyatt8740

6
এটিই একমাত্র সমাধান যা একটি সেড স্ক্রিপ্টে কাজ করে।
ফার্স্ট্রক

6
লক্ষ্য করুন ব্যাকস্ল্যাশ পালাতে আক্ষরিক সম্পর্কে newline (তাই যে এটি একটি কমান্ড টারমিনেটর নয়): এটা না (ব্যাশ হিসেবে, ইত্যাদি) একটি লাইন ধারাবাহিকতা অক্ষর। পার্থক্যটি দেখার জন্য, উদ্ধৃতিগুলি না দিয়ে উপরের কমান্ডটি লেখার চেষ্টা করুন: ব্যাকস্ল্যাশ পরিবর্তে শেল দ্বারা একটি লাইন ধারাবাহিকতা অক্ষর হিসাবে ব্যাখ্যা করা হবে এবং এটি এবং নতুন লাইনটি ফেলে দেওয়া হবে। বিপরীতে, উদ্ধৃত অভিব্যক্তির সামগ্রীগুলি (উদ্ধৃতি ব্যতীত) একটি পৃথক কমা-টু-নিউলাইন.সেট ফাইলটিতে অন্তর্ভুক্ত করুন (যা শেল সিনট্যাক্সকে মুছে ফেলে), এবং এটি কাজ করে!
নিলস ভন বার্থ

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

1
@ দ্রোগানস আপনি কি ব্যাশ, শ বা অন্য কোনও শেল ব্যবহার করছেন? আপনি কি ডাবল কোটের পরিবর্তে একক উদ্ধৃতি ব্যবহার করছেন তা নিশ্চিত?
সর্বাধিক ন্যানাসি

22

যদি আপনার অদ্ভুত ব্যবহার সম্পূর্ণরূপে প্রতিস্থাপনের অভিব্যক্তি হিসাবে থাকে (যেমন খনি হিসাবে থাকে), আপনি perl -peপরিবর্তে এটিও ব্যবহার করতে পারেন

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz

15

স্পষ্টতই \rকী!

$ sed 's/, /\r/g' file3.txt > file4.txt

এটি রূপান্তরিত:

ABFS, AIRM, AMED, BOSC, CALI, ECPG, FRGI, GERN, GTIV, HSON, IQNT, JRCC, LTRE,
MACK, MIDD, NKTR, NPSP, PME, PTIX, REFR, RSOL, UBNT, UPI, YONG, ZEUS

এটি:

ABFS
AIRM
AMED
BOSC
CALI
ECPG
FRGI
GERN
GTIV
HSON
IQNT
JRCC
LTRE
MACK
MIDD
NKTR
NPSP
PME
PTIX
REFR
RSOL
UBNT
UPI
YONG
ZEUS

আমি জানি প্রশ্নটি ওএস এক্স বলে, তবে এটি জিএনইউ সেড -4.2.2-6.fc20.x86_64 নিয়ে কাজ করে না।
ক্রিশ্চিয়ান সিউপিতু

10
মনে রাখবেন যে \rহিসাবে একই নয় \n, এবং এটি আরও ডেটা কারসাজি এবং ব্যবহার ভঙ্গ করতে পারে।
জোয়েল পুরারা

3
দুঃখিত, এটি আমার পক্ষে কার্যকর হয়নি। আমি সবেমাত্র একটি 'আর' পেয়েছি যেখানে একটি নতুন লাইন থাকা উচিত।
ফ্র্যাঙ্ক ডি গ্রোট - শিউটেন

আপনার যে উত্তর দেয় তা আরও পরিষ্কার করে দেওয়া উচিত \r!
পীর

এটি আমার পক্ষে কাজ করেছে তবে আমি অবাক হই কেন! ix
অ্যালেক্স

15

এটি ম্যাকওএস মাউন্টেন লায়ন (10.8), সোলারিস 10 (সানোজ 5.10) এবং আরএইচই লিনাক্স (রেড হ্যাট এন্টারপ্রাইজ লিনাক্স সার্ভার 5.3, টিকঙ্গা) রিলিজ করে ...

$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt

... যেখানে ^Jকরে সম্পন্ন করা হয় ctrl+ + v+ + j\আগে মনে করবেন না ^J

পিএস, আমি জানি যে RHEL এর সেডটি জিএনইউ, ম্যাকোস সেডটি ফ্রিবিএসডি ভিত্তিক, এবং যদিও আমি সোলারিস সেড সম্পর্কে নিশ্চিত নই, আমি বিশ্বাস করি যে এটি কোনও সেডের সাথে বেশ কাজ করবে will ওয়াইএমএমভি থো ...


12

ম্যাকওএস আলাদা, ম্যাক ইন সেড দিয়ে এই সমস্যাটি সমাধান করার দুটি উপায় রয়েছে

  • প্রথমে, \'$'\n''প্রতিস্থাপনটি ব্যবহার করুন \n, এটি ম্যাকওএসে কাজ করতে পারে:

    sed 's/,/\'$'\n''/g' file
    
  • দ্বিতীয়টি, কেবল একটি খালি লাইন ব্যবহার করুন:

    sed 's/,/\
    /g' file
    
  • পুনশ্চ. বিস্তৃত বিস্তারে মনোযোগ দিন '

  • তৃতীয়, ম্যাক-সেড প্রতিস্থাপন gnu-sed ব্যবহার করুন


7

এটি সম্পূর্ণ করতে, এটিও কাজ করে:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"

1
এটি বাশ ব্যতীত সিদ্ধ প্রতিযোগিতার জন্যও উপযুক্ত হবে;)
অ্যারন আর

@AaronR। আমি রাজী :-). অবশ্যই আমি trসমাধানটি পছন্দ করি , এটি ইতিমধ্যে গৃহীত উত্তর।
রাইনেস

1
এটি ওএস এক্সে কাজ করেছে \n\rinstead পরিবর্তে এটি কেন \r\n? আমি চেষ্টা করেছি \r\nযা উইন্ডোজের প্রয়োজনীয় আদেশ order যাইহোক, আমি এটি করার পরে এটি প্রচুর পরিমাণে ^Mক্যারেজ রিটার্ন অক্ষর রেখে দেয় vim, তাই আমি মনে করি এটি কেবলমাত্র হওয়ার কথা \nতবে \nএকা কাজ করে না।
NobleUplift

4

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

$ sed 's/new/
> /g' m1.json > m2.json
sed: 1: "s/new/
/g": unescaped newline inside substitute pattern

উপরের কমান্ডে আমি শিফট + এন্টার দিয়ে নতুন লাইন যুক্ত করার চেষ্টা করেছি যা কাজ করে না। তাই এবার আমি ত্রুটির মাধ্যমে বলা হিসাবে "অপ্রকাশিত নিউলাইন" "পালাতে" চেষ্টা করেছি।

$ sed 's/new/\
> /g' m1.json > m2.json 

কাজ করছে! (ম্যাক ওএস এক্স ১০.৯.৩ এ)


এটি আপনার দুই বছর আগে ম্যাক্স ন্যানাসির উত্তর থেকে আলাদা নয়।
miken32

2

কেবল পরিষ্কার করতে: ওএসএক্সে সেডের ম্যান-পৃষ্ঠা (10.8; ডারউইন কার্নেল সংস্করণ 12.4.0) বলেছেন:

[...]

সেড নিয়মিত এক্সপ্রেশন

 The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended
 (modern) regular expressions can be used instead if the -E flag is given.  In addition, sed has the following two additions to regular
 expressions:

 1.   In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression.
      Also, putting a backslash character before the delimiting character causes the character to be treated literally.  For example, in the
      context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is
      ``abcxdef''.

 2.   The escape sequence \n matches a newline character embedded in the pattern space.  You cannot, however, use a literal newline charac-
      ter in an address or in the substitute command.

[...]

সুতরাং আমি অনুমান করি যে একটিকে ট্র - যেমন উপরে উল্লিখিত - বা নিফটি ব্যবহার করতে হবে

sed "s/,/^M
/g"

দ্রষ্টব্য: আপনাকে vi সংস্করণীতে '^ এম' পেতে < সিআরটিএল> -ভি, < রিটার্ন> টাইপ করতে হবে



1

sedম্যাকোজে মোজাভে 2005 সালে মুক্তি পেয়েছিল, সুতরাং একটি সমাধান হ'ল ইনস্টল করা gnu-sed,

brew install gnu-sed

তারপরে gsedআপনার ইচ্ছা মত ব্যবহার করবে,

gsed 's/,/\n/g' file

আপনি যদি পছন্দ করেন তবে sedন্যায্য sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', যা দ্বারা প্রস্তাবিত brew info gnu-sed। আপনার পদটি পুনরায় চালু করুন, তারপরে আপনার sedকমান্ড লাইনটি gsed


0

এফডব্লিউআইডাব্লু, নিম্নলিখিত লাইনটি উইন্ডোতে কাজ করে এবং আমার পথের ভেরিয়েবেলে সেমিকোলনগুলিকে একটি নতুন লাইনের সাথে প্রতিস্থাপন করে। আমি আমার গিট বিন ডিরেক্টরিতে ইনস্টল করা সরঞ্জামগুলি ব্যবহার করছি।

echo %path% | sed -e $'s/;/\\n/g' | less
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.