ম্যাক ওএস এক্সে সেডগুলিতে নিউলাইনগুলি


44

আমি দেখতে পেলাম যে \nম্যাক ওএস এক্স এর অধীন সেডে কাজ করে না Spec

# input
foo bar

আমি ব্যবহার করি,

echo "foo bar" | sed 's/ /\n/'

তবে ফলাফলটি বোকা, \nপালানো যায় না!

foonbar

আমি গুগলে পরামর্শ করার পরে, আমি একটি কার্যপ্রণালী পেয়েছি :

echo 'foo bar' | sed -e 's/ /\'$'\n/g'

নিবন্ধটি পড়ার পরে, আমি এখনও বুঝতে পারি না এর \'$'\n/g'অর্থ কী । কেউ আমাকে এটি ব্যাখ্যা করতে পারে, বা এটির করার অন্য কোনও উপায় থাকলে? ধন্যবাদ!


এটি সম্ভবত খুব কার্যকর হবে:echo "foo bar" | tr ' ' '\n'
— গ্লেন জ্যাকম্যান

3
পরামর্শের জন্য ধন্যবাদ. তবে বর্তমানে আমি উদাহরণ হিসাবে কেবল উপরের কেসটি ব্যবহার করি, আমার কীভাবে এড়াতে হবে তা জানতে হবে \n।
— ইভান জেডজি জিয়াও

সম্ভাব্য অনুরূপ: stackoverflow.com/questions/21621722/...
— hyiltiz

উত্তর:


27

আপনি brew install gnu-sedএবং কল প্রতিস্থাপন sedসঙ্গে gsed।

আপনি যদি "g" এ প্রিপেন্ড করতে চান না sed, আপনি brew install gnu-sed --with-default-namesকেবল কল করতে পারেন sed।

(সম্পাদনা করুন: ক্লুমেন্টের জন্য ব্রু পতাকা আপডেট হয়েছে, টুপি টিপুন)


সমস্ত প্ল্যাটফর্মে একই সফ্টওয়্যারটি ব্যবহার করা ম্যাক সংস্করণের প্রতিটি বৈশিষ্ট্যের সাথে কাজ করার চেয়ে সহজ (আমার কাছে শেষ) is সাবধান, বিকল্প এখন --with-default-namesএবং না --default-names । যাইহোক, এই বিকল্পটি আমার ইনস্টলেশনতে কাজ করে নি, তাই এটির কাজটি করার জন্য alias gsed=sedআমাকে একটি সংযোজন ~/.profileকরতে হয়েছিল।
— ক্লিমেট

4
এটি একটি কুৎসিত কাজ। এটি sedওএস এক্স-তে কেন সেভাবে আচরণ করে এবং ভুল অনুমানটি gnu-sedআরও সঠিক করে তোলে তা ব্যাখ্যা করে না । দীর্ঘমেয়াদে সমস্যা এড়াতে কোনও জিএনইউ-আসক্ত হয়ে উঠবেন না এবং পসিক্স মানকে আটকে রাখুন।
— octosquidopus

এটি কীভাবে অ্যাপলকে তার ওএসকে ডিফল্টরূপে কাজ করা উচিত। কেন কোনও প্রোগ্রামের নাম ব্যবহার করুন এবং তারপরে এটি অন্যরকমভাবে কাজ করবেন? এর কারণে আমি এক ঘন্টা নষ্ট করি ...
— রাশিও

@rascio - কারণ ওএস এক্স BSD- এর মতো এবং লিনাক্স লিনাক্স-জাতীয়।
— আইআজঞ্জেক্ট

@ আরসিওও আমি মনে করি আপনি দেখতে পাবেন যে জিএনইউ সেড নতুন আগত; বিএসডি সেড 1979 সালের ( en.wikiki.org/wiki/ ভার্সন_7_উনিক্স দেখুন ) dates
— ডানকান বেইন

24

এগুলিও কাজ করবে:

echo 'foo bar' | sed 's/ /\
/g'

echo 'foo bar' | sed $'s/ /\\\n/g'

lf=$'\n'; echo 'foo bar' | sed "s/ /\\$lf/g"

ওএস এক্স এর সেড \nপ্রতিস্থাপনের প্যাটার্নটি ব্যাখ্যা করে না , তবে আপনি লাইন ধারাবাহিকতা অক্ষরের পূর্বে একটি আক্ষরিক লাইনফিড ব্যবহার করতে পারেন। শেলটি $'\n'আক্ষরিক লাইনফিডের সাথে সেড কমান্ড চালানোর আগে প্রতিস্থাপন করে ।


4
কেন sed $'s/ /\\\n/g'কাজ করে, কিন্তু হয় না sed $'s/\\\n/ /g'?
— অ্যালেক জ্যাকবসন

1
@ আলেক আপনি sedনতুন লাইনগুলি সরাতে এমনকি লিনাক্স / ইউনিক্সেও ব্যবহার করতে পারবেন না কারণ এটি প্রতিটি নিউলাইনে পার্স / বিভক্ত হয়েছে। আপনি যদি এটি লিনাক্স / ইউনিক্সে চালনা করেন তবে এটি কোনও কিছুই করবে না:echo -e 'foo\nbar' | sed 's/\n//'
— উইসবাকি

10

আপনি যে কাজের সন্ধান পেয়েছেন তা একক আর্গুমেন্ট স্ট্রিংটিতে চলে যায় sed -e।

এই যুক্তিটি পরিচিত সেড s/ / /gফর্ম্যাটে একটি স্ট্রিং হিসাবে শেষ হয় ।

একের পর এক স্ট্রিংটি দুটি অংশে তৈরি হয়।

প্রথম অংশটি '...'ফর্মের সাথে উদ্ধৃত হয়েছে ।

দ্বিতীয় অংশটি $'...'ফর্মের সাথে উদ্ধৃত হয়েছে ।

's/ /\'অংশ একক উদ্ধৃতি খুলে পায়, কিন্তু অন্যথায় sed শুধু যেমন কম্যান্ড-লাইন দেখায় মাধ্যমে প্রেরণ করা হয়। অর্থাত, ব্যাকস্ল্যাশ ব্যাশ দ্বারা খাওয়া হয় না, এটি সেডের কাছে চলে যায়।

$'\n/g'অংশ ডলার চিহ্ন এবং একক-কোট খুলে পায়, এবং \nএকটি newline অক্ষর রূপান্তরিত হয়।

সব মিলিয়ে তর্ক হয়ে যায়

এস / / \ newline/ জি

[ঐটা মজা ছিল. এটি মোড়ক করতে কিছুক্ষণ সময় নিল। একটি আকর্ষণীয় প্রশ্নের জন্য +1।]


7

অভিব্যক্তিটি $'...'একটি- bashবিভক্তি যা ...প্রমিত প্রসারিত ক্রমগুলি প্রসারিত করে produces ম এর \'আগে কেবল একটি ব্যাকস্ল্যাশ অর্থ উদ্ধৃত বিভাগের শেষে, এর পরে ফলাফলটি স্ট্রিং s/ /\। (হ্যাঁ, আপনি একটি স্ট্রিংয়ের মাঝখানে উদ্ধৃতি স্যুইচ করতে পারেন; এটি স্ট্রিংটি শেষ করে না))

পসিক্স মানটি sedকেবল \nঅনুসন্ধানের ধরণের অংশ হিসাবে গ্রহণ করে। ওএস এক্স, ফ্রিবিএসডি ব্যবহার করে sedযা কঠোরভাবে পসিক্স অনুগত; জিএনইউ, যথারীতি অতিরিক্ত জিনিস যুক্ত করে এবং তারপরে লিনাক্স ব্যবহারকারীরা সকলেই ভাবেন যে এটি "স্ট্যান্ডার্ড" একরকম (সম্ভবত তাদের মধ্যে দুটিতে যদি মানক প্রক্রিয়া থাকে তবে আমি আরও মুগ্ধ হব)।


এখন আমি $'...'অংশটি বুঝতে পারি । কিন্তু ... কি s/ /\ ? আপনি কি বলতে চাইছেন switch quoting?
— ইভান জেডজি জিয়াও

2
'...'শেল উদ্ধৃতি এক প্রকার; $'...'অন্য একটি। আছে "..."এবং \xএকটি একক চরিত্র উদ্ধৃত। আপনি একটি একক শব্দে এগুলিকে একত্রিত করতে পারেন, যা সেখানে এটি করা হচ্ছে, একটি সাধারণ ''স্ট্রিং থেকে $''স্ট্রিংয়ে অনুবাদ করার জন্য স্ট্রিংয়ে স্যুইচ করে \n। বাকী হিসাবে, এটি একটি sedকমান্ড তৈরি করছে ( s/text/replacement/flags)। এই ক্ষেত্রে কমান্ডটি শুরুর পরে আক্ষরিক নতুন লাইনটি সুরক্ষিত করতে ব্যাকস্ল্যাশ সহ অন্তর্ভুক্ত হয় $'\n/g'। ফলাফলটি /gনতুন লাইনের সাথে সমস্ত ( পতাকা) স্পেসগুলি প্রতিস্থাপন করে ।
— গীকোসৌর

1

দৃষ্টিগোচরভাবে দেখার জন্য খুব সহজেই ঘটছে যা ঘটছে। কেবল স্ট্রিং প্রতিধ্বনি!

echo 's/$/\'$'\n/g'

ফলাফল স্বরূপ

s/$/\
/g

যা সমান s/$/\newline/g

যদি আপনার \আগে অতিরিক্ত না থাকে newline, শেলটি newlineকমান্ডের সমাপ্তি হিসাবে অকালপূর্বে ব্যাখ্যা করবে ।

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