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


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.